1 数组
数组(Array)是一种线性表的数据结构,它用一段连续的内存空间,来存储具有相同类型的值。但是由于在PHP的底层定义中,数组是通过散列表实现的,所以这段定义并不适用。PHP的数组可以存储任意数据类型的数据,所以相对于Java来说效率较高。在Java的数组中,每次定义都要先声明属于组的类型,在查找数组时,效率是O(1),但是在插入和删除时,算法复杂度是O(n),因为在插入操作时,要先找到插入的位置,然后将该位置及往后的元素都往后移一位。删除同理。但是PHP却不受此约束。
2 链表
和数组不同,链表并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,一般节点有两个属性(data和next)。链表有多种类型,最简单的是单链表。
时间复杂度是靠更差的空间复杂度换取的,双向链表始终需要单链表的两倍空间在 Web 应用中,时间效率优先级更高,所以我们通常都是空间换时间来提高性能。
3 栈
限定只能在一端进行插入和删除操作的线性表,并且满足先进后出的特点。我们把允许插入和删除的一端叫做栈顶,另一个端叫做栈底,不含任何数据的栈叫做空栈。栈支持通过数组/链表实现,通过数组实现的通常叫做顺序栈,通过链表实现的叫做链栈。
4 队列
和栈类似,队列也是一种特殊的线性表结构,只不过队列是在一端插入,另一端删除,就跟我们平常排队一样,从队尾入队,在队头出去,所以队列的特性是先入先出,允许插入的一端叫队尾,允许删除的一端叫队头。队列也可以通过数组和链表实现,通过数组实现的叫顺序队列,通过链表实现的叫做链式队列,栈只需要一个栈顶指针就可以了,因为只允许在栈顶插入删除,但是队列需要两个指针,一个指向队头,一个指向队尾。
5 重要的编程技巧:递归
递归,简单来讲就是在函数定义中调用函数自身,将一个大的问题拆分成多个小问题,逐一击破后最后归并结果。判断一个问题是否可以通过递归来解决,主要看它是否满足以下三个条件:
1 一个问题的解可以分解为几个子问题的解 2 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 3 存在递归终止条件
递归一定要有终止条件,否则会导致函数被无限调用最终致使内存溢出