基本介紹
- 中文名:線性搜尋
- 外文名:A linear search
- 特點:線性
- 性質:搜尋
算法步驟,實例,
算法步驟
procedurelinearsearch(x:整數,a1,a2,...,an:不同整數)
i:=1
while(i<=n&&x=/(不等於)ai)
i:=i+1
ifi<=nthenlocation:=i
elselocation:=0
{location是等於x的下標,或是0(找不到)}
最壞情況下使用O(n)次比較,2分搜尋算法最壞情形複雜度O(logn)次比較,2分搜尋算法比之線性搜尋最壞情況下要好.
實例
int seqsearch(int list[], int searchnum, int n)
{
int i;
list[n] = searchnum; //把搜尋值放到最後一個位置,簡化代碼
for(i = 0; list[i] != searchnum; i++)
;
return ((i < n ) ? i : -1);
} 咱們考慮一個最基本的最佳化方法,就是把訪問到的數據和第一個數據互換。
int seqsearch(int list[], int searchnum, int n)
{
int i;
int ret = -1;
list[n] = searchnum; //把搜尋值放到最後一個位置,簡化代碼
for(i = 0; list[i] != searchnum; i++)
;
if(i == 0) {
return 0;
}
if(i<n) {
int temp = list[0];
list[0] = list[i];
list[i] = temp;
ret = 0;
}
return ret;
}
這段代碼把搜尋到的記錄和第一個記錄互換,如果同一個記錄連續被訪問,那么只用做一次比較,提高了性能。但如果兩個記錄互動被訪問,如1 2 1 2 1 2……,那么性能就會下降了。我們來看一個模擬LRU的代碼:
int seqsearch(int list[], int searchnum, int n)
{
int i;
int ret = -1;
list[n] = searchnum; //把搜尋值放到最後一個位置,簡化代碼
for(i = 0; list[i] != searchnum; i++)
;
if(i==0)
return 0;
if(i<n) {
int temp = list[i];
int j;
for(j =i; j>0; j--)
list[j] = list[j-1];
list[0] = temp;
ret = 0;
}
return ret;
}