挑战程序设计(算法和数据结构)—搜索(包括STL)

文章目录

          • 线性搜索
          • 二分搜索
          • 散列法
          • STL部分

线性搜索

O(N)(引入标记后效率提升数倍(第二种))

void Linear(int S[], int T[], int ns, int nt)
{
    for(int i=0; i
二分搜索

O(Nlog(N))
特点模板数组先排序,才可以使用二分搜索

int Binary(int S[], int T[], int ns, int nt)
{
    int sum = 0;
    for(int i=0; iS[mid])
            {
                left = mid+1;
            }
            else if(T[i]
散列法

O(1)
重点是哈希函数的构造,我

//哈希函数
h1(key)
	return key%m
h2(key)
	return 1+(key%(m-1))
h(key, i)
	return (h1(key)+i*h2(key))%m

insert(T, key)//使用哈希函数插入该值,用i来解决冲突
	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
STL部分
  • sort默认升序排列,可以自键函数来排序。如下函数实现降序排列(>代表降序排序)
bool cmp(int x, int y){
	return x>y;
}
  • STL提供了binary_search、lower_bound、upper_bound。
    头文件:#include
    binary_search(A, A+n, indx)A: 数组首地址;n: 数组元素个数;indx: 需要查找的值。
    函数功能: 在数组中以二分法检索的方式查找,若在数组(要求数组元素非递减)中查找到indx元素则返回true,若查找不到则返回值为false。
    lower_bound(A, A+n, p):返回一个迭代器,该迭代器指向第一个不小于p值的元素,如果均小于p,该迭代器指向最后一个元素的下一个元素。对于数组,返回的是地址,可以使用lower_bound(A, A+n, p)-A求下标。
    upper_bound(A,A+n,p):返回一个迭代器,该迭代器指向第一个大于p值的元素,如果没有大于p的值,该迭代器指向最后一个元素的下一个元素。
    参考博文:C++ STL中的Binary search(二分查找)

你可能感兴趣的:(挑战程序设计-算法和数据结构)