a.
linearsearch()
for i from 0 to n -1if
(a[i]
== key)
return i
return not found
b.linearsearch()
i =0 a[n]
= key;
while
(a[i]
!= key)
i++if(i == n)
return not found
return i
區別:
a和b的區別在於主迴圈中比較運算的次數。a需要2個比較運算,乙個是for迴圈的結束條件for i from 0 to n - 1
,還有乙個是關鍵字的比較a[i] == key
,而b只有乙個不等價運算a[i] != key
。由於標記能確保while不死迴圈,因此可以省去迴圈結束條件。
意義:
線性搜尋演算法複雜度為o(n),但在引入標記後效率可以提公升常數倍
,處理大規模資料時會有比較明顯的效果。
a.左開右閉:
binarysearch()
l =-
1, r = n -1;
while
(r - l >1)
m =(l + r)
>>1if
(x > a[m]
) l = m;
else
r = m;
return r;
說明:
二分查詢很重要的一點是確保能夠返回 [0, n-1] 的任意數,部分模板對邊界的處理不太好。我們想要的始終是 r
rr 這個下標的值。所以必須是把=
== 是放在 r
rr 這邊的。返回的是第乙個大於等於 x
xx 的下標
題意:
用 $ k$ 輛卡車裝 n
nn 個貨物,貨物的重量為 wi(
i=0,
...n
−1
)w_i(i=0,...n-1)
wi(i=
0,..
.n−1
) ,每輛卡車可裝載的貨物數大於等於0,但是貨物重量總和不得超過卡車的最大運載量 p
pp。所有卡車的最大運載量 p
pp 一致。求出裝載全部貨物所需的最大運載量p
pp 的最小值。
思路:
二分的區間為 [單個重量的最大值,所有重量總和]。
對於每個p
pp , 判斷是否滿足條件即可。
#include
#include
#include
#include
using namespace std;
const
int maxn =
100000+5
;int w[maxn]
;int n, k;
bool judge
(int p)
else
}//printf("p=%d truck=%d\n", p, truck);
if(truck <= k)
return true;
else
return false;
}int
binarysearch
(int max,
int sum)
return r;
}int
main()
int ans =
binarysearch
(max, sum)
;printf
("%d\n"
, ans)
;}
補充:b.左閉右開
binarysearch()
l =0
, r = n
while
(r - l >1)
int m =
(l + r)
>>1if
(x < a[m]
) r = m;
else
l = m;
return l;
lower_bound
: 返回陣列第乙個大於等於 x
xx 的座標, 作用同a
upper_bound
: 返回陣列第乙個大於 x
xx 的座標,作用同b
a[6]
=;lower_bound
(a, a +6,
3)=2
upper_bound
(a, a +6,
3)=5
雜湊法是一種搜尋演算法,它可以根據各元素的值來確定儲存位置,然後將位置保管在雜湊中,從而實現資料的高速搜尋。
h(k)
: 根據k值求陣列t下標的函式為雜湊函式,值範圍為[0, m - 1]
m
: 陣列長度(自己開的陣列)。一般取為質數(1046527)
h(k)=h(k, i)
: 用開放位址法解決衝突。注意,因為下標每次移動h2(k),所以h2(k)要和m互質
衝突
:2個不同的key匹配到了陣列同乙個下標
h1
(key)
return key mod m
h2(key)
return1+
(key %
(m -1)
)h(k, i)
return(h1
(key)
+ i *
h2(key)
) mod m
insert (t, key)
i =0while true
j =h(key, i)
if t[j]
== nil
t[j]
= key
return j
else
i = i +
1search
(t, key)
i =0while true
j =h(key, i)
if t[j]
== key
return j
else
if t[j]
== nil or i >= m
return nil
else
i = i +
1
題意:
#include
#include
#include
#include
#include
using namespace std;
typedef
long
long llong;
const
int m =
1046527
;const
int nil =-1
;string h[m]
;llong getchar
(char c)
llong getkey
(string s)
return sum;
}inth1(
int key)
inth2
(int key)
void
init()
void
insert
(string str)
else
if(h[h]
== str)
return;}
}bool find
(string str)
}int
main()
}return0;
}
說明:
字串轉換成數字採用了雜湊,關於為什麼p * = 5,我本來想的是10,書本是5,大概是因為5的話數字更小一點,而且acgt只有1-4,類似於轉換成乙個5進製的數。
我本來想的是直接存乙個h[m]陣列,因為感覺數字比較和存起來更方便。對啊…………為什麼不存數值呢????
線性查詢法 二分查詢法
陣列的查詢 在陣列中尋找特定元素的過程。1 線性查詢法 演算法思路 線性查詢法是將要查詢的關鍵字key與陣列中的元素逐個進行比較,直到列表中找到與關鍵字匹配的元素,或者查完列表也沒有找到。如果匹配成功,返回與關鍵字匹配的元素在陣列中的下標,如果沒有找到則返回 1。適用於小陣列或沒有排序的陣列中查詢,...
線性查詢 二分查詢
在陣列中找出某個值a 線性查詢 二分查詢 線性查詢就是乙個個比較,找出那個值a。二分查詢是針對有序數列,找出中間值nid與a比較,mid a,從mid左邊小於mid的值中查詢,這樣依次縮小查詢空間,找到該值。線性查詢法 value 3 array 1,2,3,4,5,6,7 def ls ary,v...
c 線性查詢 二分查詢
今天蒟蒻來給大家講線性查詢 二分查詢 一 線性查詢思路 1.思路 線性查詢是一種在資料中查詢資料的演算法。線性查詢的操作十分簡單,只要在陣列中從頭開始依次往下查詢即可。如果找到了輸出即可,沒有找到就繼續搜下去。2.先來找10好了 第一步 從3開始找,3不等於10,換下乙個 第二步 到9,9不等於10...