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


  • 相关阅读:
    JS动态添加事件
    Asp.Net验证控件浅析
    word 文档如何加密
    scp 自动带密码参数复制文件到主机
    Zabbix监控Dell服务器相关硬件资源
    Zabbix的history相关数据表数据太大,执行表分区操作过程
    mysql日常操作
    linux下利用tcpdump抓包工具排查nginx获取客户端真实IP实例
    解决ssh登录很慢的问题以及jumpserver登录主机出现:Authentication timeout
    keepalived启动后报错:(VI_1): received an invalid passwd!的解决办法
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5305160.html
Copyright © 2011-2022 走看看