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

线性搜索

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

void Linear(int S[], int T[], int ns, int nt)
{
    for(int i=0; i<nt; i++)
    {
        /*
        //第一种
        for(int j=0; j<ns; j++)
        {
            if(S[j]==T[i])
            {
                a.push_back(S[j]);
                break;
            }
        }
        */
        //第二种(速度快)
        int j=0;
        S[ns] = T[i];//标记,用于以下失败时退出循环
        while(T[i]!=S[j] ) j++;
        if(j!=ns) a.push_back(S[j]);
    }
}
二分搜索

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

int Binary(int S[], int T[], int ns, int nt)
{
    int sum = 0;
    for(int i=0; i<nt; i++)//搜索的元素来源的数组T
    {
        int left = 0;
        int right = ns;
        int mid;
        while(left<right)//left为数组起始下标,right为数组末尾元素下标加一
        {
            mid = (left+right)/2;
            if(T[i]>S[mid])
            {
                left = mid+1;
            }
            else if(T[i]<S[mid])
            {
                right = mid;
            }
            else
            {
                sum++;//计数T和S共有的元素的个数
                break;
            }
        }
    }
    return sum;
}
散列法

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<algorithm>
    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(二分查找)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值