今天休息一下暫停物件導向系列,來説說搜尋。
搜尋要有資料嘛,而資料有分兩種:
一種是有索引(index)的資料,例如章節、目錄,索引結構包含Binary Search Tree、B tree、Hash table等等。
另一種是沒有索引,直接在檔案或符號裡搜尋,稱為在循序結構上搜尋資料,就是今天要聊的部分。
在此介紹兩種簡單的搜尋大法:
循序搜尋,又稱線性搜尋,如其名循序一個接著一個搜下去,通常用在沒有排序過的檔案,有幾筆資料就搜索幾次,因此不適合大量資料時使用。
例如有100萬筆資料,最糟的可能是要搜尋一百萬遍(目標在最後一個),時間複雜度為O(N)。
int linearSearch(){
int i;
for(i = 0; i < n; i++){
if(a[i] == key)
return(i);
}
return -1;
}
完整程式範例:
#include <iostream>
using namespace std;
int search(int arr[], int f){
int i;
for(i =0; i < 6;i++){
if(arr[i] == f){
return i;
}
}return -1;
}
int main()
{
int arr[] = {2,11,7,1,9,5,8};
int result;
search(arr,0);
if(result == -1){
cout << "Not Found" << endl;
}else cout << "Number Found" <<endl;
return 0;
}
只能用在已經排序過(sorted)的資料! ,由小到大排序好。
因為是利用把資料對切一半,找出可能的範圍藉此縮短搜尋時間的方法。
如果全部不照大小排好,對切法無法達成效果,請看以下。
例如有一串數字,1,2,3,4,5,6,7,8,9,10,我們想找到數字3是否在這個裡面,linear search會從1 -> 2 ....10,直到找到目標或是到底為止。
而binary search是這樣用的:
用程式翻譯如下:
注:int m
是middle中間的意思,left
和right
如上是左邊右邊,target
是要搜尋的值,n
是指sizeof(array) / sizeof(array[0]);
int BinarySearch(int array[], int n, int target){
int left = 0; right = n-1, m;
while(left <= right){
m = (1eft + right )/2;
if(target == array[m]){
return(m);
if(target > array[m]){
left = m + 1;
}else
right = m - 1;
}
return -1;
}
}
完整程式碼:
#include <iostream>
using namespace std;
int BinarySearch(int array[], int n, int target){
int left = 0, right = n-1, m;
while(left <= right){
m = (left + right )/2;
if(target == array[m])
return(m);
if(target > array[m])
left = m + 1;
else
right = m - 1;
}
return -1;
}
int main(){
int array[] = {3, 4, 5, 6, 7, 8, 9};
int n = sizeof(array) / sizeof(array[0]);
int result = BinarySearch(array, n, 7);
if (result == -1)
printf("Not found");
else
printf("Element is found at index %d", result);
}
注:printf跟cout都是輸出的意思
Reference: Geeksforgeeks, cplusplus, programiz