常见内存索引的比较

平衡tree:

优点:

  1. 插入删除查找效率为logn,插入或删除可能导致树结构多次旋转,每次旋转时间是O(1)
    2.有序,支持范围查找
    缺点:
    1.平衡要求过于严格,导致过多的旋转

skip list:

优点:

  1. 实现简单
  2. 插入删除查找效率平均为logn
  3. 支持range操作,节点是有序排列的。
  4. 插入删除所修改的节点少,操作相对独立,并发时需要加锁的节点更少,支持更高的并发度

缺点:

  1. 插入节点的高度不确定,空间局部性差一些
  2. 可能内存占用会比较多,这取决于节点爬升概率

思考:

  1. range操作比rb tree快?没有做过实验,不好说。表面上看sl只用两次logn定位到边界,然后遍历链表。但好像有人说rb tree父节点由于空间局部性会缓存在cpu cache,两者速度没什么区别...

hash table:

优点:

  1. 插入查找删除的操作平均是O(1),这建立在哈希算法冲突率低的条件下

缺点:

  1. 数据存放无序,不支持range
  2. 动态扩展性较差,数据填满后性能下降比较严重,扩容(resize)带来的数据迁移复制(rehash)耗时较多

hash tree:

优点:

  1. 相比于hash table,动态扩展性好,不需要提前分配空间
  2. 插入查找操作取决于树的高度,一般高度在10附近,也就是大致为O(10),这得益于质数分辨定理

缺点:

  1. 也是无序存储,不支持range

关于hash tree,有人叫它Merkel tree,有人叫哈希树。有的博客说哈希树是底层叶节点存储具体数据,中间节点存储两两子节点的哈希值,最终汇聚成root节点,称为top hash之类...
详见:https://blog.csdn.net/yexudengzhidao/article/details/102760027

有的博客说是每层节点的子节点个数是连续质数,比如root节点有2个节点,这两个节点各自有3个节点,以此类推。存储数据时,和2取余得1就存于第2个节点,如果冲突就继续看下一层,除3余0就存在第一个节点....
详见:https://blog.csdn.net/yang_yulei/article/details/46337405

posted @ 2021-12-17 15:08  moon_orange  阅读(132)  评论(0编辑  收藏  举报