经常使用数据结构的应用场景小结

一、单向连接算法

单向链表适用于只从一端单向访问的场合,这种场合通常来讲:数组

(1)、删除时,只适合删除第一个元素;数据结构

(2)、添加时,只直接添加到最后一个元素的后面或者添加到第一个元素的前面;优化

(3)、属于单向迭代器,只能从一个方向走到头(只支持前进或后退,取决于实现),查找效率极差。不适合大量查询的场合。ui

这种典型的应用场合是各种缓冲池和栈的实现。指针

二、双向链表排序

双向链表相比单向链表,拥有前向和后向两个指针地址,因此适合如下场合:索引

(1)、删除时,能够删除任意元素,而只须要极小的开销;内存

(2)、添加时,当知道它的前一个或后一个位置的元素时,只须要极小的开销。效率

(3)、属于双向迭代器,能够从头走到尾或从尾走到头,但一样查找时须要遍历,效率与单向链表无改善,不适合大量查询的场合。

这种典型的应用场景是各类不须要排序的数据列表管理。

三、数组(含Delphi中动态数组)、列表(Delphi/C++ Builder中的TList)向量(C++中std::vector)

这种数据结构使用一段连续的空间来存贮元素,因此能够直接经过索引来获取到某个元素,并且能够经过对元素的内容进行排序,而后使用二分法查找,从而提供查找效率。其适合的场合主要是:

(1)、不会频繁增删元素的场合,由于增删元素都牵涉到元素空间的从新分配,频繁的内存分配操做会大幅下降操做效率。但添加操做时,能够经过预分配足够的空间来优化添加时的效率。

(2)、属于随机迭代器,能够随机访问任意元素。对于已排序的元素查找起来效率较高。

四、二叉树(含红黑树、平衡二叉树等)

这个数据结构相似于双向链表,任意插入元素时都会自动排序,红黑树和平衡二叉树都使二叉树尽可能平衡,从而使查询时和二分法相似。它适合的场合主要是:

(1)、须要时刻保证列表元素的有序排列;

(2)、须要频繁的增删和查询操做;

(3)、属于双向迭代器,不能随机访问任意元素;

五、哈希桶

这个数据结构使用数组和链表来管理元素,在好的桶尺寸和哈希算法支持下,理想上能够达到接近数组的随机访问效率。其适合的场合主要是:

(1)、不须要保证元素的顺序(由于它是按哈希值决定插入到那个桶里,与原始数据内容无关);

(2)、须要频繁的增删和查询操做;

(3)、属于单向或双向迭代器(取决于具体实现),不能随机访问任意元素。

相关文章
相关标签/搜索