二分法检索

前序

二分法检索时一种常用的搜索算法,是一种非常基础并高效的检索算法,其时间复杂度为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个关键字,每个关键字不保存数据,只用来索引,数据都保存在叶子节点。是为文件系统而生的。

二分法检索