最近總結了各大排序算法的原理 ,並對其進行了實現,想着一並把查找算法總結了,今天就着手開始總結查找算法。
廢話不多說。這篇文章從最簡單的查找算法開始講起。之后會補充復雜的二叉搜索樹查找(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;
}
完整代碼下載點擊:
