算法,先于计算机存在于世,比编程语言本身更为重要,语言只是工具,而算法才是灵魂。---云风《游戏之旅-我的编程感悟》第二章(4m8h)
1、算法评估
1.空间复杂度
2.时间复杂度
3.对基本操作的评估(一次加减乘除或内存访问,函数调用,都可以算作一次基本操作)
通常用大O表示法(big-Oh notation)来表示问题的复杂度,它表达的是问题的计算量的层次,O即Order的缩写,O(n^2)表示基本操作使用的次数和问题的规模成平方的关系。
常见的层次按一下表递增:
2、数据结构
程序是由算法和数据结构组成的,要想学算法,也要学会如何去组织数据,处理数据。
1.线性表
a.数组和链表
数组:指屋里地址连续的表,可以用内存地址来检索到对应的元素,可以用常数时间访问到指定2位置的元素,但是在中间插入和删除元素的时间复杂度为线性的。
链表:每个元素的物理位置是任意的,通过指针串接起来,它访问的时间非常长,但是插入和删除的速度却很快,由于需要额外的空间记录元素的前后关系,占用内存也大于数组。
b.堆栈、队列和串
堆栈和队列是两种特殊的线形表。
堆栈:只能从一头进出,先进入的数据后出来,广泛用于类C语言的函数调用机制。做深度优先搜索求解问题时也需要它。
队列:和堆栈相反,采用先进先出,让数据从线性表的一头进入,从另一头出去,用来保持元素的先后顺序,被广泛用在消息通讯中,也可以用于广度搜索的算法。
优先队列:每个元素都有一个优先级,出队列的时候,永远是优先级最小的元素优先,通常不是由线性表来实现。
c.树、二叉树及其他
树:对有层次的数据集的一种组织方式,树中每个数据节点都有或没有它所下属的数据集,除了根节点是整棵树的根源外,每个数据节点都有唯一的父亲。
二叉树:二叉树的子树有明确的左右之分,让左子树指向自己的一个儿子,让右子树指向自己的下一个兄弟。在表达式计算和数据压缩,以及排序查找方面都有很多的用途。
四叉树及八叉树:四叉树用于平面划分,八叉树用于三维空间,这里所说的空间,不仅仅局限于游戏里的场景空间。
图:图中每个节点并没有父子关系,图纯粹是点和边的集合,节点和节点之间允许加上一些与它相关的数,称为权,带权的图一般叫做网络,节点和节点之间可以是无方向的连接,也可以是有向连接。
d.映射表
key和内容对应起来。