查找算法系列之簡單查找:順序查找、二分查找、分塊查找


最近總結了各大排序算法的原理 ,並對其進行了實現,想着一並把查找算法總結了,今天就着手開始總結查找算法。

廢話不多說。這篇文章從最簡單的查找算法開始講起。之后會補充復雜的二叉搜索樹查找(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



免責聲明!

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



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