六种常用搜索算法

it2023-06-19  77

搜索算法

顺序搜索快速搜索二分搜索插值搜索跳跃搜索hash搜索

顺序搜索

O(n) int order_search(vector<int>& data, int target) { int n = (int)data.size(); for(int i = 0; i < n; ++i) { if(target == data[i]) return i; } }

快速搜索

平均O(n), 最坏O(n^2), 序列不需要有序获取第k+1大的元素(下标k-1) int quick_search(vector<int>& data, int l, int r, int key) { int i = l; int j = r; int temp = data[l]; while(i < j) { while(i < j && data[j] >= temp) --j; data[i] = data[j]; while(i < j && data[i] <= temp) ++i; data[j] = data[i]; } data[i] = temp; if(i < key) quick_search(data, i+1, r, key); else if (i > key) quick_search(data, l, i-1, key); else return data[i]; }

二分搜索

序列需要有序, 时间复杂度O(logn) int binary_search(vector<int>& data, int target) { int l = 0; int r = (int)data.size()-1; while(l <= r) { int mid = l + (r-l)/2; if(data[mid] < target) l = mid + 1; else if (data[mid] > target) r = mid - 1; else return l; } return -1; }

插值搜索

序列需要有序, 时间复杂度O(loglogn) int intelpolation_search(vector<int>& data, int target) { int l = 0; int r = (int)data.size()-1; while(l <= r) { int pos = l + (target - data[l])/(data[r] - data[l]) * (r-l); if(data[mid] < target) l = mid + 1; else if (data[mid] > target) r = mid - 1; else return l; } return -1; }

跳跃搜索

在n个元素排序元素中, 以n/m的步伐搜索, 0, n/m, 2n/m… 当找到第一个大于target时, 遍历m-1次时间复杂度O(根号n), n/m + m -1 当m=sqrt(n)时取最小值 int jump_search(vector<int>& data, int target) { int n = (int)data.size(); int step = (int)sqrt(n); int i = step; while(i < n) { if(data[i] > target) break; i += step; } i = min(i, n); for(int j = i-1; i >= i - step; --i) { if(data[j] == target) return j; } return -1; }

hash搜索

无序没有重复元素, 时间复杂度O(1) int hash_search(vector<int>& v, int target) { map<int, int> mp; for(int i = 0; i < v.size(); ++i) { mp.insert(pair<int, int>(v[i], i)); } if(mp.find(target) != mp.end()) return mp[target]; else return -1; }
最新回复(0)