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