数据结构学习——二叉树

Vector和List的特点:

类型底层结构随机访问插入和删除空间利用率 使用场景
Vectorvector的底层结构是动态顺序表,在内存中是一段连续的空间O(1)查询数据位置最坏需要O(N),且数据迁移最坏也需要O(N)内存中是一段连续的空间,所以不容易造成内存碎片,利用率高vector适合需要高效率存储,需要随机访问,并且不管行插入和删除效率的场景
Listlist的底层结构是带头节点的双向循环链表,在内存中不是一段连续的空间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)。(适度平衡放宽:任一节点左右子树的高度,相差不超过两倍)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值