查找算法最强总结及其算法实现( 三 )


  • Java中的java.util.TreeMap,java.util.TreeSet;
  • C++ STL中的:map,multimap,multiset;
  • .NET中的:SortedDictionary,SortedSet 等 。
5.4 B树和B+树(B Tree/B+ Tree)
普遍运用在数据库和文件系统 。
B树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点 。
  • 根节点至少有两个子节点
  • 每个节点有M-1个key,并且以升序排列
  • 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
  • 其它节点至少有M/2个子节点
可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素 。B树的插入及平衡化操作和2-3树很相似,这里就不介绍了 。
下面是往B树中依次插入6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4
B+树是对B树的一种变形树,它与B树的差异在于:
  • 有k个子结点的结点必然有k个关键码;
  • 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中 。
  • 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录 。
B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历 。
但是B树也有优点,其优点在于,由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速 。
  • windows:HPFS文件系统;
  • mac:HFS,HFS+文件系统;
  • linux:ResiserFS,XFS,Ext3FS,JFS文件系统;
  • 数据库:ORACLE,MySQL,SQLSERVER等中 。
树表查找总结:
二叉查找树平均查找性能不错,为O(logn),但是最坏情况会退化为O(n) 。在二叉查找树的基础上进行优化,我们可以使用平衡查找树 。平衡查找树中的2-3查找树,这种数据结构在插入之后能够进行自平衡操作,从而保证了树的高度在一定的范围内进而能够保证最坏情况下的时间复杂度 。但是2-3查找树实现起来比较困难,红黑树是2-3树的一种简单高效的实现,他巧妙地使用颜色标记来替代2-3树中比较难处理的3-node节点问题 。红黑树是一种比较高效的平衡查找树,应用非常广泛,很多编程语言的内部实现都或多或少的采用了红黑树 。
除此之外,2-3查找树的另一个扩展——B/B+平衡树,在文件系统和数据库系统中有着广泛的应用 。
6. 分块查找
解释:https://blog.csdn.net/u013036274/article/details/49176027
属于顺序查找,分块查找又称索引顺序查找,它是顺序查找的一种改进方法 。
[图片上传失败…(image-fd2e41-1551795346605)]
算法思想:
将n个数据元素"按块有序"划分为m块(m ≤ n) 。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……
算法流程:
step1 先选取各块中的最大关键字构成一个索引表;
step2 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找 。
7.哈希查找
单纯论查找复杂度:对于无冲突的Hash表而言,查找复杂度为O(1)(注意,在查找之前我们需要构建相应的Hash表) 。
常见的解决冲突的方法:拉链法和线性探测法 。
详细的介绍可以参见:浅谈算法和数据结构: 十一 哈希表 。
附录:
Java完整代码,带有测试用例:
主要参考网页http://www.cnblogs.com/maybe2030/p/4715035.html#_label6




推荐阅读