Vector和List的特点:
类型 | 底层结构 | 随机访问 | 插入和删除 | 空间利用率 | 使用场景 |
Vector | vector的底层结构是动态顺序表,在内存中是一段连续的空间 | O(1) | 查询数据位置最坏需要O(N),且数据迁移最坏也需要O(N) | 内存中是一段连续的空间,所以不容易造成内存碎片,利用率高 | vector适合需要高效率存储,需要随机访问,并且不管行插入和删除效率的场景 |
List | list的底层结构是带头节点的双向循环链表,在内存中不是一段连续的空间 | O(N) | 查询数据位置最坏需要O(N),插入和删除仅改变前后指针指向需要O(1) | 动态开辟空间,容易造成内存碎片,空间利用率低 | list适合有大量的插入和删除操作,并且不关心随机访问的场景 |
二叉树的概念引入,是为了兼顾Vector和List的优点:高效地查找、插入和删除。以平衡二叉搜索树(已经有序)为例,静态查找和动态修改操作都可以在O(logn)以内。
二叉搜索树的search、insert和remove操作的运行时间正比于树高,当最坏情况下,二叉树会退化成列表,查找时间复杂度降为O(N).为了解决这个问题引入AVL树(平衡二叉搜索树)的概念,即兄弟子树高级尽可能接近,维持一定的平衡状态(通过旋转操作实现)。
AVL树:将树的高度控制在O(logn)以内,以保证每次查找、插入或删除均可在O(logn)的时间内完成。(适度平衡:任一节点左右子树的高度,相差不超过1)
伸展树:逐层伸展,节点V一旦被访问,随即转移到树根。(一步一步往上爬;自下而上,逐层单旋;直到v最终被推送至根。)
B-树:越来越小的内存,系统存储容量的增长速度<<应用问题规模的增长速度。现在典型问题的数据集都以TB为单位。从磁盘读写1B和1KB几乎一样快。B树是一种平衡多路搜索树。
AVL树,查询n=1G个记录:每次查找需要log(2,10^9)=30次I/O,每次只读出一个关键码;
B-树,充分利用外存比批量访问的高效支持,将此特点转化为优点。每下降一层,都以超级节点为单位,读入一组关键码,目前多数数据库系统采用m=200~300,当m=256时,每次查找只需log(256,10^9)=4次I/O.
红黑树:针对AVL树,删除操作之后的重平衡可能需要做O(logn)次旋转,从而频繁地导致全树整体拓扑结构的大幅度变化。红黑树的引入就是为了解决这个不足,可保证每次插入或删除操作之后的重平衡过程中,全树拓扑结构的更新仅涉及常数个节点,最坏情况仍是O(logn),就分摊意义而言仅为O(1)。(适度平衡放宽:任一节点左右子树的高度,相差不超过两倍)