能够简单的按照速度将通用数据结构划分为:数组和链表(最慢),树(较快),哈希表(最快)。增、删、改、查是四大常见操做,不过其实能够浓缩为两个操做:增和查。删除操做和和修改操做都是创建在查找操做上的,因此完美的数据结构应该是具备较高的插入效率和查找效率。数组
能够根据下图选择合适的通用数据结构:数据结构
数组在如下三个情形下颇有用:性能
1)数据量较小。spa
2)数据规模已知。操作系统
3)随机访问,修改元素值。blog
若是插入速度很重要,选择无序数组。若是查找速度很重要,选择有序数组,并使用二分查找。队列
1)须要预先知道数据规模内存
2)插入效率低,由于须要移动大量元素。效率
链表的出现解决了数组的两个问题:扩展
1)须要预先知道数据规模
2)插入效率低
1)数据量较小
2)不须要预先知道数据规模
3)适应于频繁的插入操做
1)有序数组能够经过二分查找方法具备很高的查找效率(O(log n)),而链表只能使用顺序查找,效率低下(O(n))。
1)有序数组具备较高的查找效率(O(log n)),而链表具备较高的插入效率(头插法,O(1)),结合这两种数据结构,建立一种貌似完美的数据结构,也就是二叉查找树。
1)数据是随机分布的
2)数据量较大
3)频繁的查找和插入操做(能够提供O(log n)级的查找、插入和删除操做)
1)若是处理的数据是有序的(升序/降序),那么构造的二叉查找树就会只有左子树(或右子树),也就是退化为链表,查找效率低下(O(log n))。
1)针对二叉查找树可能会退化为链表的状况,提出了平衡树,平衡树要求任意节点的左右两个子树的高度差不超过1,避免退化为链表的状况。
1)不管数据分布是否随机均可以提供O(log n)级别的查找、插入和删除效率
2)数据量较大
1)平衡树的实现过于复杂。
同平衡树同样,哈希表也不要求数据分布是否随机,不过哈希表的实现比平衡树要简单得多。
1)不须要对最大最小值存取。
2)不管数据分布是否随机,理想状况下(无冲突)能够提供O(1)级别的插入、查找和删除效率。
3)数据量较大
1)因为是基于数组的,数组(哈希表)建立后难以扩展,使用开放地址法的哈希表在基本被填满时,性能降低的很是严重。
2)不能对最大最小值存取。
1)在输入数据量可预知的情形下,可使用数组实现栈,而且数组实现的栈效率更高,出栈和入栈操做都在数组末尾完成。
1)若是对数组大小建立不当,可能会产生栈溢出的状况
1)不会发生栈溢出的状况
2)输入数据量未知时,使用链栈。经过头插法实现入栈操做,头删法实现出栈操做。出栈和入栈均是O(1)。
1)因为入栈时,首先要建立插入的节点,要向操做系统申请内存,因此链栈没有顺序栈效率高。
若是数据量已知就使用数组实现队列,未知的话就使用链表实现队列。出队和入队均是O(1)。