查詢 線性查詢,二分查詢,雜湊法

2021-08-17 15:19:37 字數 4247 閱讀 9497

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...