基本数据结构:
-
数组:查询效率高,新增和修改需要移动元素效率低,内存分配是连续的内存,扩容需要重新分配内存。
-
链表:新增和修改效率高,只需要修改指针指向就好。链表查询效率低,需要从链表头依次查找。内存分配不需要连续的内存,占用连续内存少。
动态数据结构:
- 散列表:可以说是利用数组和链表两个基本数据结构设计了一个高效的动态数据结构。利用了数组的随机访问特性,用于满足根据某个属性来随机访问元素。基于key查找效率很高O(1).同时借助链表进行散列冲突解决方案,删除和插入操作效率也可以接近O(1).试用场景:海量数据随机访问、防止重复、缓存等。
缺点:需要设计合理的散列函数,并且要考虑散列冲突和动态扩容。
- 跳表:尽管散列表效率很高,但是散列表是无序的,跳表效率和散列表类似,并且支持区间序列的输出(因为基于链表)。使用场景:对有序元素的快速查找、插入和删除。
缺点:比较占用内存。
- 红黑树:红黑树是平衡二叉查找树的一种近似实现。红黑树和跳表类似,但是实现方式有所差异。红黑树存在的价值是,它可以实现比较高效的查找,删除和插入。虽然相比高度平衡的AVL树效率有所下降,但是红黑树不用耗费太多精力维护平衡。相比跳表,红黑树除了内存占用较小,其他性能并不比跳表更优。但由于历史原因,红黑树使用的更广泛。
缺点:实现比较复杂。
有了如此高效的散列表,为什么还需要二叉树?
二叉查找树是有序符号表,元素的排列是有序的,而散列表是不排序的。
如果除了需要实现查找功能,还需要实现获取排序操作,如最小值、最大值,小于(大于)KEY的最小值、最大值等操作,二叉查找树优于散列表,反之,散列表优于二叉查找树。