參考:
目錄
第九章 查詢
9.1 查詢的方法
9.2 相關面試題
9.1.1 順序查詢定義:順序查詢又稱線性查詢,其查詢過程就是從表中第乙個記錄開始,逐個進行記錄的關鍵字和給定值的比較。順序查詢的優化:設定乙個哨兵a[0]=key,從末尾往前查詢;如果查詢過程中a[i]=key,則返回i值,否則最終一定在a[0]處返回,說明a[1]到a[n]中沒有關鍵字key,查詢失敗。這種方法在資料量大的時候可以極大提高效率。
對於順序查詢來說,其平均時間複雜度為o(n)。
9.1.2 有序表查詢
1、二分查詢
二分查詢也叫折半查詢,前提是線性表中的記錄必須是關鍵碼有序(通常從小到大有序),線性表必須採用順序儲存,這種折半特性的演算法時間複雜度為 o(logn)。
折半查詢的思想:在有序表中,若給定值小於中間記錄的關鍵字,則在中間記錄的左半邊繼續查詢,若給定的值大於中間記錄的關鍵字,則在中間記錄的右半邊繼續查詢,不斷重複,直到查詢成功,或查詢區域無記錄,查詢失敗為止。
通常來說,二分查詢的**框架如下:
int binarysearch(int nums, int key) else if (nums[m] > key) else
}return -1;
}
注意:
int binarysearch(int nums, int key) else
}return l;
}
該實現和正常實現有以下不同:
在 nums[m] >= key的情況下,可以推導出最左key位於 [l, m] 區間中,這是乙個閉區間。h的賦值表示式為h = m,因為m位置也可能是解。
在 h 的賦值表示式為 h = m 的情況下,如果迴圈條件為 l <= h,那麼會出現迴圈無法退出的情況,因此迴圈條件只能是 l < h。
當迴圈體退出時,不表示沒有查詢到 key,因此最後返回的結果不應該為 -1。為了驗證有沒有查詢到,需要在呼叫端判斷一下返回位置上的值和 key 是否相等。
2、插值查詢
Swift簡明教程(五)列舉與結構體
使用enum關鍵字建立列舉型別。與類類似,列舉型別中一樣可以定義方法。enum rank int let ace rank.ace let acerawvalue ace.torow 試驗 編寫乙個函式用來比較兩個rank列舉值 在上面的 中,列舉型別的原始值是int型別,定義的時候只明確了第乙個,...
資料結構與演算法教程彙總
一 演算法 1.二分法 2.遞推演算法 分為順推法 又叫 斐波那契數列 和倒推法 兩種 演算法思想 3.列舉 窮舉 演算法 4.遞迴演算法 5.分治演算法 演算法思想 把大問題分解成n個小問題 6.貪婪演算法 7.試探法演算法 8.模擬演算法 二 資料結構 1.線性結構 資料元素之間是一對一的關係 ...
ios面試資料結構與演算法
1 不用中間變數,變換a和b的值 1.中間變數 void swap int a,int b 2.加法 void swap int a,int b 3.異或 相同為0,不同為1.可以理解為不進製加法 void swap int a,int b 2 求最大公約數 1.直接遍曆法 int maxcommo...