二分法检索
前序
二分法检索时一种常用的搜索算法,是一种非常基础并高效的检索算法,其时间复杂度为O(log n),Btree,B+tree,红黑树等算法是基于二分法拓展的ji检索算法,常用与大数据量下文本的搜索,如数据库(mysql,mongodb)的索引。(后面会大致说一下这几种的区别)
code如下:
package com.link; import org.junit.Test; /** * 二分法检索 */ public class BinarySearch { private final int[] NUM = new int[]{1,4,6,8,10}; @Test public void testSearch(){ System.out.println(getIndexes(10)); } public int getIndexes(int num){ return getIndexes(num, NUM); } public int getIndexes(int num, int[] sortedArr){ assert sortedArr != null : "array can not be null"; int low = 0; int high = sortedArr.length-1; while (low <= high){ int mid = (low+high)/2; if (num == sortedArr[mid]) { return mid; } else if (num > sortedArr[mid]) { low = mid + 1; } else { high = mid -1; } } return -1; } }
AVL,红黑树,Btree,B+tree
1,AVL树:平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。我们可以推出AVL树适合用于插入删除次数比较少,但查找多的情况。
2,红黑树:平衡二叉树,通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长2倍,因而是近似平衡的。所以相对于严格要求平衡的AVL树来说,它的旋转保持平衡次数较少。用于搜索时,插入删除次数多的情况下我们就用红黑树来取代AVL。
3,B树,就是二叉树的多路查找树,一般用于数据库系统中,分支多层数少,将关键字索引到相印到节点映射出磁盘地址,大数据量下减少下大量到磁盘IO以及物理寻址到次数。
4,B+树是B树的变种树,有n棵子树的节点中含有n个关键字,每个关键字不保存数据,只用来索引,数据都保存在叶子节点。是为文件系统而生的。