查找
1. 线性搜索
简单线性查找伪代码:
linearSearch()
for i = 0 ... n-1
if A[i] 与key相等
return i
return not_found
含有标记的线性查找
// 相比以上的代码,减少了比较次数,无须判断i<n
linearSearch()
i = 0
A[n] = key
while A[i] 和key不同
i++
if i到达了n
return not_found
return i
2. 二分搜索
要求数据集合先进行排序。
伪代码:
binarySearch(A, key)
left = 0
right = n
while left < right
mid = (left + right) / 2
if A[mid] == key
return mid
else if key < A[mid]
right = mid
else
left = mid + 1
return not_found
3. 散列法
散列法可根据各元素的值来确定元素的存储位置,再将位置保管在散列表中,从而实现高速搜索。其由容纳m个元素的数组T, 以及根据数据关键字决定数组下标的函数共同组成。
简单实现:
insert(data)
T[h(data.key)] = data
search(data)
return T[h(data.key)]
散列函数,如 h(k) = k mod m
若只采用一个散列函数,可能会发生不同的key对应同一散列值,就会导致冲突,为解决冲突,可采用开放地址法,如双散列结构,一旦出现冲突,程序会调用第二个散列函数来求值
H(k) = h(k, i) = (h1(k) + i * h2(k)) mod m (必须保证T的长度m与h2(k) 互质,否则会出现无法生成下标的情况0)
伪代码实现:
h1(key)
return key mod m
h2 (key)
return 1 + (key mod (m-1))
H(key, i)
return (h1(key) + i * h2(key)) mod m
insert (T, key)
i = 0
while true
j =H(key, i)
if T[j] ==NIL // 判断当前位置是否空着
T[j] = key
return j
else
i = i + 1
search(T, key)
i = 0
while 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
4.利用STL搜索
使用迭代器
在二分搜索中,STL提供了binary_search、lower_bound(返回一个迭代器,且该迭代器指向第一个不小于指定值得元素)、upper_bound等方法

浙公网安备 33010602011771号