数据结构总结

  • 高级数据结构

    • 红黑树与AVL树

      AVL树: AVL树、红黑树都是自平衡的二叉搜索树,时间复杂度都为(log N)。AVL通过左旋,右旋来调整树的平衡因子,根据LR,LL,RR,RL四种情况判断左旋与右旋.(比起红黑树要简单得多)

      红黑树: 与AVL树相比,它的删除时旋转调整最多三次(AVL树需要log N次),但是它因此也牺牲了一定的平衡性(黑平衡,两子树高度最多相差一倍)。它与B树中的2-3-4树类似,它通过父子节点的颜色的关系简化了2-3-4树,通过对比两者,可以更加容易理解红黑树.(红黑树删除逻辑太多了,博主放弃了.)
      参考博客:
      从2-3-4树到红黑树
      红黑树之删除节点

    • B树与B+树与B*树

      三者都是多路查找树,适合作为数据库索引,利用磁盘预读功能,将多个关键字放到一个节点上,实现多路查找.B+树与B树不同的是,B+树叶子节点存放的才是数据(叶子节点都在最后一层,形成了链表结构,便于进行范围查找),而非叶子节点存的是关键字,这样可以存放更多的关键字,树的高度也更低,IO次数也少. B*树:在B+树基础上,为非叶子结点也增加链表指针.

    • 哈希

      通过将key经过哈希函数(O(1)复杂度)并且取模运算后,映射到数组的一个桶上,利用数组的O(1)查找时间,实现O(1)时间的查找.当发生哈希冲突时,可以找个空桶解决(ThreadLocal里是这样的),也可以跟一个链表.
      哈希函数设计: 数字类型的话,取模一个素数.字符串的话,类似于多进制转十进制,有兴趣可以看一下String类的hashcode()方法.

    • 跳跃表

      好多地方都用到了,有兴趣可以了解一下.是有序链表的一个改进,原来有序链表只能以O(N)时间复杂度查找,跳跃表以O(log N)时间查找.并且与红黑树相比实现简单,在并发情况下,同步可以使用CAS操作,而由于红黑树操作过多,不适合使用CAS,只能直接加锁.

    • 字典树

      在字符串长度有限的情况下,用于统计,排序和保存大量的字符串(不仅限于字符串),经常被搜索引擎系统用于文本词频统计。利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较。

    • 经常用于求解TOP K问题(使用快速排序的思想是更快的,但是需要内存足够的情况),在外排序时,也就是多路归并时,假设有K个数组,每次选最小的那个值,也就是比较K次,但是如果我们维护一个K大的堆时,每次移除原来最小的值,添加新值时,只需(log N)时间便可调整到最小堆.

    • 位图

      有点像哈希,将一定范围的数据映射到连续的桶(位)上,用于排序,或者判断某些值是否存在.

    • AC自动机

      用于多模式匹配,将多个模式串构成一个字典树,然后构建其fail指针,类似KMP算法,匹配失败指向fail指针位置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章