zoukankan      html  css  js  c++  java
  • 有序表查找

    顺序表查找法,代码简单但是不智能。

    1.折半查找法-binary search

    如果线性表在排序是有序的 这种情况下我们才用顺序存储。

    //折半查找法
    int BinarySearch(int* a,int n, int key)
    {
    	int low=0;
    	int high=n-1;
    	while(low<=high)
    	{
    		int mid = (low+high)/2;
    		if(key<a[mid])
    		{
    			high=mid-1;
    		}
    		else if(key>a[mid])
    		{
    			low = mid+1;
    		}
    		else
    			return mid;
    	}
    	return -1;//表示失败
    }
          折半查找法类似于把静态有序查找表分成了两颗子树,时间复杂度为O(log N),当我们对顺序数据已经排序好,并且没有频繁插入删除时用折半查找法。

    2.插值查找法

          我们在字典中查找apple或者zoo一定不是按照折半查找法这样 会直接从前面或者后面查找,

    不一定非要mid=(low+high)/2;

    mid=(low+high)/2=low+(high-low)/2;

    mid = low+(high-low)((key-a[low])/(a[high]-a[low]) )

    //插值查找法
    int BinarySearch(int* a, int n, int key)
    {
    	int low=0;
    	int high = n-1;
    	while(low<=high)
    	{
    		int mid = low+(low+high)*((key-a[low])/(a[high]-a[low]));
    		if(key<a[mid])
    		{
    			high = mid-1;
    		}
    		else if(key>a[mid])
    		{
    			low=mid+1;
    		}
    		else
    		{
    			return mid;
    		}
    	}
    	return -1;
    }
    此时时间复杂度还是O(longN),当关键字分部比较均匀时候可用此法。

    3.斐波那契查找 O(log N)

    //斐波那契数列
    void Fibonacci()
    {
    	int F[100];
    	F[0]=0;
    	F[1]=1;
    	for(int i=2;i<=100;i++)
    	{
    		F[i]=F[i-1]+F[i-2];
    	}
    }
    
    int Fibonacci_Search(int* a, int n, int key)
    {
    	int k=0;
    	int low=0;
    	int high=n-1;
    	while(n>F[k]-1)//计算n位于斐波那契数列的位置
    	{
    		k++;
    	}
    	for(int i=n-1;i<F[k]-1;i++)
    	{
    		a[i]=a[n-1];
    	}//将斐波那契数列 不满地方补全
    	while(low<=high)
    	{
    		mid = low+F[k-1]-1;
    		if(key<a[mid])
    		{
    			high = mid-1;
    			k=k-1;
    		}
    		else if(key>a[mid])
    		{
    			low = mid+1;
    			k=k-2;
    		}
    		else
    		{
    			if(mid<=n-1)
    			{
    				return mid;
    			}
    			else
    			{
    				return -1;//失败
    			}
    		}
    	}
    }
    应当说 当顺序存储无序时 采用顺序查找法

    当顺序存储已经排序好 我们可以采用折半查找法mid=(low+high)/2;

    插值查找法mid=low+(high-low)*((key-a[low])/(a[high]-a[low]));

    斐波那契法mid=low+F[k-1]=1; 
    以上三中算法无非就是mid 选取的不一样而已 不过在mid 选取时候也有加减乘除计算的。

    http://blog.csdn.net/jnu_simba/article/details/8881708



    关注公众号 海量干货等你
  • 相关阅读:
    《程序员修炼之道:从小工到专家》读后感2
    Java第五节课总结
    FirstJavaWeb
    Java第四节课总结
    《程序员修炼之道:从小工到专家》读后感1
    Java第三节课总结
    递归回文
    原码、补码和反码
    Java第二节课总结
    C++ STL的容器类型
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734458.html
Copyright © 2011-2022 走看看