为什么一定要学算法?

算法,先于计算机存在于世,比编程语言本身更为重要,语言只是工具,而算法才是灵魂。—云风《游戏之旅-我的编程感悟》第二章(4m8h)

1、算法评估

    1.空间复杂度

    2.时间复杂度

    3.对基本操作的评估(一次加减乘除或内存访问,函数调用,都可以算作一次基本操作)

通常用大O表示法(big-Oh notation)来表示问题的复杂度,它表达的是问题的计算量的层次,O即Order的缩写,O(n^2)表示基本操作使用的次数和问题的规模成平方的关系。

常见的层次按一下表递增:

《为什么一定要学算法?》 复杂度

2、数据结构

程序是由算法和数据结构组成的,要想学算法,也要学会如何去组织数据,处理数据。

    1.线性表

    a.数组和链表

数组:指屋里地址连续的表,可以用内存地址来检索到对应的元素,可以用常数时间访问到指定2位置的元素,但是在中间插入和删除元素的时间复杂度为线性的

链表:每个元素的物理位置是任意的,通过指针串接起来,它访问的时间非常长,但是插入和删除的速度却很快,由于需要额外的空间记录元素的前后关系,占用内存也大于数组

    b.堆栈、队列和串

堆栈和队列是两种特殊的线形表。

堆栈:只能从一头进出,先进入的数据后出来,广泛用于类C语言的函数调用机制。做深度优先搜索求解问题时也需要它。

队列:和堆栈相反,采用先进先出,让数据从线性表的一头进入,从另一头出去,用来保持元素的先后顺序,被广泛用在消息通讯中,也可以用于广度搜索的算法。

优先队列:每个元素都有一个优先级,出队列的时候,永远是优先级最小的元素优先,通常不是由线性表来实现。

c.树、二叉树及其他

树:对有层次的数据集的一种组织方式,树中每个数据节点都有或没有它所下属的数据集,除了根节点是整棵树的根源外,每个数据节点都有唯一的父亲。

二叉树:二叉树的子树有明确的左右之分,让左子树指向自己的一个儿子,让右子树指向自己的下一个兄弟。在表达式计算和数据压缩,以及排序查找方面都有很多的用途。

四叉树及八叉树:四叉树用于平面划分,八叉树用于三维空间,这里所说的空间,不仅仅局限于游戏里的场景空间。

图:图中每个节点并没有父子关系,图纯粹是点和边的集合,节点和节点之间允许加上一些与它相关的数,称为权,带权的图一般叫做网络,节点和节点之间可以是无方向的连接,也可以是有向连接。

d.映射表

key和内容对应起来。

    原文作者:Italks
    原文地址: https://www.jianshu.com/p/98ff17d16a01
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞