zoukankan      html  css  js  c++  java
  • 查找算法系列之简单查找:顺序查找、二分查找、分块查找

    最近总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手開始总结查找算法。

    废话不多说。这篇文章从最简单的查找算法開始讲起。之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等。

    顾名思义,查找就是寻找到keyword在队列中的位置,最笨的查找算法就是依次顺序比較,复杂度为O(n)。可是有非常多方法的复杂度能够达到O(logn)等等。

    1.顺序查找

    keyword与数组中的数顺序比較,时间复杂度O(n).

    template<class T>
    int OrderSearch(T *x, int N, T keyWord)
    {
    	for(int i = 0; i < N; i++)
    	{
    		if(x[i] == keyWord)
    			return i;
    	}
    	return -1;
    }

    2.二分查找

    二分查找的条件是原数组有序。在查找时,将keyword与数组中间的数比較。若等于则找到。若大于则在其右边寻找,若小于则在其左边寻找,然后递归的进行二分查找。

    时间复杂度O(logn)。

    若有较频繁的插入操作,对于维护二分查找须要的有序结构,须要付出一定的时间代价。

    template<class T>
    int binarySearch(T *x, int low, int high, T keyword)//递归
    {
    	if(low > high)
    		return -1;
    	int mid = (low + high)/2;
    	if(x[mid] == keyword) 
    		return mid;
    	if(x[mid] < keyword)
    		return binarySearch(x, mid+1, high);
    	if(x[mid] > keyword)
    		return binarySearch(x, low, mid-1);
    }

    template<class T>
    int binarySearch(T *x, int N, T keyword)//无递归
    {
    	int low = 0, high = N-1,mid;
    	while(low <= high)
    	{
    		mid = (low + high)/2;
    		if(x[mid] == keyword)
    			return mid;
    		else
    			if(x[mid] < keyword)
    				low = mid + 1;
    			else
    				high = mid -1;
    
    	}
    	return -1;
    }

    3.分块查找

    分块查找是顺序查找的一种改进方法。

    首先须要对数组进行分块,分块查找须要建立一个“索引表”。索引表分为m块,每块含有N/m个元素,块内是无序的,块间是有序的,比如块2中最大元素小于块3中最小元素。

    先用二分查找索引表。确定须要查找的keyword在哪一块,然后再在对应的块内用顺序查找。

    分块查找又称为索引顺序查找。

    时间复杂度:O(log(m)+N/m)

    //分块查找
    template<class T>//索引表
    struct INDEXTable
    {
    	T key;
    	int link;
    };
    
    template<class T>  IndexOrderSearch(INDEXTable<T> *indexTable,T *x, int N, int m, T keyword)// indexTable为索引表,x为原数组,N为数组大小,m为块大小
    {
    	int L = (N+m-1)/m;
    	int i = 0;
    	while(i < L && indexTable[i].key < keyword)
    		i++;
    	if(i == L)
    		return -1;
    	else
    	{
    		int j = indexTable[i].link;
    		for(j; j<indexTable[i].link + m;j++)
    			if(x[j] == keyword)
    				return j;		
    	}
    	return -1;
    }
    


    完整代码下载点击:

    查找算法代码C++——包含顺序、二分、BST、哈希

    http://download.csdn.net/detail/u010025211/8841123


  • 相关阅读:
    caffe常用层: batchNorm层和scale层
    简述configure、pkg-config、pkg_config_path三者的关系
    python删除list中元素的三种方法
    Leetcode 872. Leaf-Similar Trees
    Leetcode 508. Most Frequent Subtree Sum
    Leetcode 572. Subtree of Another Tree
    Leetcode 894. All Possible Full Binary Trees
    Leetcode 814. Binary Tree Pruning
    Leetcode 557. Reverse Words in a String III
    python 多维list声明时的小问题
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5305160.html
Copyright © 2011-2022 走看看