前提:資料結構為順序儲存且已排序。每次與中間值比較,範圍減半,時間複雜度 O(log n)。
public static int binarySearch(int[] arrays, int key) {
int start = 0, end = arrays.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (arrays[mid] == key) return mid;
if (arrays[mid] < key) start = mid + 1;
else end = mid - 1;
}
return -1;
}
概念:建立索引表 (如字典首字母索引),先查索引定位區塊,再在區塊內查找 (可用二分)。
// 索引項目
class IndexItem implements Comparable<IndexItem> {
String firstChar; int startIndex;
// 建構子、compareTo 略
}
// 查找流程:二分查索引 -> 確定區塊範圍 -> 二分查關鍵字陣列
核心:雜湊函數 + 衝突解決 (鏈接法)。平均查找 O(1)。
public class HashSet<T> {
private SingleLinkedList<T>[] table;
public HashSet(int size) {
table = new SingleLinkedList[Math.abs(size)];
for (int i = 0; i < table.length; i++) table[i] = new SingleLinkedList<>();
}
private int hash(T x) { return Math.abs(x.hashCode()) % table.length; }
public void insert(T x) { table[hash(x)].insert(0, x); }
public T search(T key) { return table[hash(key)].search(key); }
}
| 演算法 | 前提條件 | 平均時間複雜度 | 適用場景 |
|---|---|---|---|
| 線性查找 | 無 | O(n) | 小量資料、無序資料 |
| 二分查找 | 有序、順序儲存 | O(log n) | 大量有序陣列/列表 |
| 分塊索引 | 資料可分組、有索引鍵 | O(log n) 區塊內 | 字典、大型有序檔案 |
| 雜湊查找 | 良好的雜湊函數 | O(1) | 頻繁查找、鍵值對存取 |