查找總結(一)-----簡單查找和折半查找


先介紹一個概念,平均查找長度(ASL)為每一個關鍵字出現的概率*查找該關鍵所進行比較的次數,所有關鍵字這樣的值之和

 

一.簡單查找

    簡單查找,也就是一個個地比較了,不多說

int Easy_find(char c[],int n,char key)
{
	int i=0;
	while (i<n&&c[i]!=key)
	{
		i++;
	}
	if (i<n)
	{
		return i;
	}
	else
	{
		return NO_FIND;
	}
}

    時間復雜度分析:while循環最少比較1次,最多比較n次,所以時間復雜度為O(n),另外,平均查找長度為(1+2+....n)*n/2/n=n+1/2;總之,平均查找長度也為O(n),當然,這是在假設每個關鍵字的概率相同

 

 

 

 

折半查找

  所謂折半查找,還是借鑒了折半的思想,通過這種方式減少比較的次數,和插入類排序中減少尋找插入位置的時間是一樣的,不多說,下面是折半插入的代碼

#define NO_FIND -1

//注意! 折半查找需滿足兩個重要條件:1.元素本來是有序的2.元素必須采用順序結構...實際上凡是遇到折半的思想,基本都要蠻子這兩個條件
int Half_find(char a[],int n,char key)
{
	int low=0;
	int high=n-1;
	while (low<=high)
	{
		int mid=(low+high)/2;
		if (key==a[mid])
		{
			return mid;
		}
		else if (key>a[mid])
		{
			low=mid+1;
		}
		else if (key<a[mid])
		{
			high=mid-1;
		}
	}
	return NO_FIND;

}

  

 

要注意兩點:

      1.折半查找只適用於順序存儲結構

      2.折半查找要求關鍵字事先是有序的

  順便總結一下:事實上凡是用到了折半思路的算法基本上都有這兩個要求,折半插入排序因為自身的原因,在尋找插入位置的時候,事先肯定是有序的

 

算法分析:

  折半查找比較的次數可用二叉判定樹來判斷,注意!,二叉判定樹並不是二叉排序樹,百度搜索排名第一的那個博客瞎jb說,真是誤人子弟,二叉判定樹根本就不是一顆完全二叉樹,但是他的深度和相同結點數目的完全二叉樹是一樣的,就是|log2(n)|+1(注:這里兩條豎線,是取下值的意思,)

 

因此,折半查找的比較次數最少為1次,也就是只比較根節點,最多為|log2(n)|+1次,時間復雜度為O(log2(n))平均查找長度也是O(log2(n))級別的,具體值大約為log2(n+1)-1;

 

 

 

分塊查找法:

    思路:

        將關鍵字分為若干塊,塊有以下特點

          1.塊間有序:塊間的排序用塊內關鍵字的最大值比較而得

          2.塊內無序

    步驟:首先,用折半查找來確定所查關鍵字所處的塊

        然后,在塊內用簡單查找

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM