数据结构,就是设计一种存储和读取的结构。设计一个好的数据结构是一个好的开端,便于以后的开发工作。
在分析程序的执行时间时,最重要的是把程序看成是独立于程序设计语言的算法或是一系列步骤。
函数的渐进增长:给定两个函数 f(n) 和 g(n),如果存在一个整数N,对所有的 n>N 时,f(n)>g(n) 恒成立,那么就说 f(n) 的增长渐进快于 g(n)。
举个例子:f(n) = n; g(n) = n^2; 那么显然当 n>1 时,n^2>n是恒成立的。 如果把这两个函数应用在某两个算法上的话,比如 a的算法复杂度是f(n),b的算法复杂度是g(n),显然a的复杂度小于b的。
判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注最高阶项的阶数。某个算法,随着n的增大,它会越来越优于另一算法,或者越差于另一算法。
算法的时间复杂度:一般来说就是程序执行时间的一种度量方式。记作 T(n)=O(f(n)) 。表示随着规模n的增大,算法执行时间的增长率和 f(n) 的增长率保持一致,称为算法的时间复杂度。
从这个记作方式上可以看出,一般随着n的增大,T(n) 增长越慢,算法的时间复杂度越低,算法的效率越高。
O(1) 一般叫常数阶;O(n) 叫线性阶;O(n^2) 叫平方阶;O(logn) 叫对数阶 等等。这个分析一般是在规模n下,对程序执行次数的度量。
顺序存储结构:类似于一个数组,有顺序。在内存里开辟出来一块连续空间,供他们使用。
单链表:一个数据元素分数据域和指针域,利用指针,形成一个链表。内存地址不必连续。
静态链表:有些高级语言没有指针的概念,牛人们利用一个较长的数组,模拟链表。每个数组元素有两个键,同样一个存储数据,一个存储指向下一个元素的位置。
循环链表: 单链表中,最后一个节点指向null。单链表没法往回走,就使得最后一个结点去指向头结点。
双向链表:单链表中,一个元素只存在了一个指针域,指向后继元素地址,这样没法直接找到前驱元素, 双向链表就整了俩指针,一个指向前驱,一个指向后继。
栈:也是线性表结构,只允许在尾部进行插入和删除。
分顺序栈,和链栈...和顺序存储和单链表类似。
队列:也是线下表结构,只允许表头插入,表尾删除。
分顺序存储的循环队列,和链队列(实则是个先进先出的单链表)。
一般已知最大长度时,可以使用循环队列,否则建议使用链队列。链队列不担心溢出问题(如果溢出,意味着整个内存资源都没地方了。。)
设计程序时,分清两个结构。一个是结点的结构,一个是链的结构。
树:各种树。以二叉树为主。节点,叶子节点,双亲节点,根,这些定义。
理解二叉树,完全二叉树等的一些性质。
二叉树的存储结构。顺序存储适合表示完全二叉树,每个节点的序号作为下标。
其它二叉树的存储结构,利用二叉链表。每个节点有三个区域,一个数据域,一个指向左儿子的指针域,一个指向右儿子的指针域。