查找(二分、hash、桶)
先上一个最简单的题
给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。
第一行两个整数 n 和m。
第二行n个正整数(1<=n<= 100000)
第三行m个整数(1<=m<=100000)
一共m行,若出现则输出YES,否则输出NO
这个题数据很小,既可以用二分、桶、做,也可以用hash来做
用桶的思想来做的话是最简单的,定义一个bool数组,出现的正整数在数组里标记为TRUE;查找sum有没有出现过时只需要调用bool下标为sum的数组就行。
#include<iostream>
using namespace std; bool s[];
int m,n; int main()
{
cin>>n>>m;
for(int i=;i<=n;++i)
{
int sum;
cin>>sum;
s[sum]=true;
}
for(int i=;i<=m;++i)
{
int sum;
cin>>sum;
if(s[sum])cout<<"YES\n";
else cout<<"NO\n";
}
return ;
}
桶
如果数据进一步升级,出现过的数进一步增大,空间进一步限制,这时用bool就不行了,需要用到二分查找,先存数,然后查找即可;
#include<iostream>
#include<algorithm>
#include<string>
using namespace std; bool boo[];
int s[];
int n,m; bool find(int sum)
{
int right=n,left=;
while(right>=left)
{
int mid=left+(right-left)/;
if(s[mid]==sum)return true;
if(mid<sum)left=mid+;
else right=mid-;
}
return ;
} int main()
{
cin>>n>>m;
for(int i=;i<=n;++i)
cin>>s[i];
sort(s+,s+n+);
for(int i=;i<=m;++i)
{
int sum;
cin>>sum;
if(find(sum))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return ;
}
二分查找
最后,如果再进一步升级,咳咳,还是用hash吧;
这里是把数模一个数,然后建立以余数和数的边,查找是将待查找的数取余,查找余数所连接的边。
#include<iostream>
#define mod 4567;
using namespace std; struct node
{
int a,b,next;
};
node s[]; int head[],sum=;
int m,n; void push(int a,int b)
{
s[sum].a=a;
s[sum].b=b;
s[sum].next=head[a];
head[a]=sum++;
} bool find (long long sum)
{
int x=sum%mod;
int y=sum/mod;
for(int k=head[x];k!=-;k=s[k].next)
if(s[k].b==y)return true;
} int main()
{
for(int i=;i<=;++i)
head[i]=-;
int m,n;
cin>>m>>n;
for(int i=;i<=m;++i)
{
long long sum;
cin>>sum;
int x=sum%mod;
int y=sum/mod;
push(x,y);
}
for(int i=;i<=n;++i)
{
long long sum;
cin>>sum;
if(find(sum))
cout<<"YES\n";
else cout<<"NO\n";
}
return ;
}
hash
当然,选用其他的hash函数也是可以的,例如将数的每一位数字加起来,建立边表;当然,选择hash函数的原则对于每一个映射有尽量少的值与之对应,也就是一一对应关系
例如:hash函数%10;则对于1和11,他们对应的hash值一样,就需要存储下每个值,那么算法就会变慢,n为映射值相同的数的数目。
当然,hash所映射的不光是整数,字符串也可以;
现在我又找到了另外一种方法,用STL里的容器MAP就可以;
map是一种关联容器,恩。
看了下百科,表示没看懂;
#include<iostream>
#include<map>
using namespace std;
map<string,int>mapp;
int main()
{
int n,m;
cin>>n>>m;
for(int i=;i<=n;++i)
{
string s;
cin>>s;
mapp.insert(map<string,int>::value_type(s,i));
}
while(m--)
{
string number;
cin>>number;
if(mapp.count(number))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
// if(mapp.find(number)!=mapp.end())
// cout<<"YES"<<endl;
// else cout<<"NO"<<endl;
}
return ;
}
代码
查找(二分、hash、桶)的更多相关文章
- BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6243 Solved: 2007[Submit] ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- 查找练习 hash——出现过的数字 分类: 查找 2015-06-18 17:30 7人阅读 评论(0) 收藏
查找练习 hash--出现过的数字 *Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 有一个数据字典,里面存有n个数字(n<=10 ...
- BZOJ1014: [JSOI2008]火星人prefix(splay 二分 hash)
题意 题目链接 Sol 一眼splay + 二分hash,不过区间splay怎么写来着呀 试着写了两个小时发现死活不对 看了一下yyb的代码发现自己根本就不会splay.... // luogu-ju ...
- 【bzoj3796】Mushroom追妹纸 Kmp+二分+Hash
题目描述 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 4.w的长度应尽可能大 求w的最大长度. 输入 输入有三行,第一行为 ...
- BZOJ4698: Sdoi2008 Sandy的卡片(二分 hash)
题意 题目链接 Sol 用什么后缀数组啊 直接差分之后 二分+hash找最长公共子串就赢了啊... 时间复杂度:\(O(nlogn)\)(不过我写的是两个log..反正也能过) // luogu-ju ...
- UVA12206 Stammering Aliens 【SAM 或 二分 + hash】
题意 求一个串中出现至少m次的子串的最大长度,对于最大长度,求出最大的左端点 题解 本来想练哈希的,没忍住就写了一个SAM SAM拿来做就很裸了 只要检查每个节点的right集合大小是否不小于m,然后 ...
- 【BZOJ1414/3705】[ZJOI2009]对称的正方形 二分+hash
[BZOJ1414/3705][ZJOI2009]对称的正方形 Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们 ...
- LOJ#111. 后缀排序(二分 hash)
题意 给出一个字符串,求出排名为$i$个字符串在原串中的开始位置 Sol 纪念一下这伟大的时刻qwq. 我用二分+hash把这题水过去了qwq. #include<cstdio> #inc ...
- UVA - 12338 Anti-Rhyme Pairs 二分+hash
题目链接:传送门 题意: 给你n个串 问你任意两个串的最大公共前缀长度是多少 题解: 二分+hash 思路很明显,我最近用来写hash 很鸡肋 #include<bits/stdc++.h> ...
随机推荐
- POJ 2182 / HDU 2711 Lost Cows(平衡树)
Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular di ...
- C++的几种字符类型
我们在C学过了char字符类型. 在C++中,char是基本的字符类型,但却不仅仅有这一种字符类型! 类型 含义 该类型数据所占的最小比特位数 char 字符 8位(即可表示28个字符) wchar_ ...
- HDU 2175 汉诺塔IX
http://acm.hdu.edu.cn/showproblem.php?pid=2175 Problem Description 1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根 ...
- 微服务日志监控与查询logstash + kafka + elasticsearch
使用 logstash + kafka + elasticsearch 实现日志监控 https://blog.csdn.net/github_39939645/article/details/788 ...
- bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记
这道题首先可以看出坐标没有什么意义离散掉就好了. 然后你就会发现你要每次都更改坐标,而一旦更改受影响的是坐标里的所有数,要是一个一个的改,会不可描述. 所以换个视角,我们要找的是某只鸟所到每个坐标时遇 ...
- POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)
The Maximum Number of Strong Kings Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2488 ...
- eclipse安装反编译插件jadclipse
下载jadClipse地址: 目的:将一些封装的jar或者sdk可以查看源代码 链接: http://pan.baidu.com/s/1kTN4TPd 提取码: 3fvd 将net.sf.jadcl ...
- 用静态工厂的方法实例化bean
//代码如下: package com.timo.domain; public class ClientService { //use static factory method create bea ...
- lwIP RAW_API
lwIP RAW TCP/IP接口 作者: Adam Dunkels, Leon Woestenberg, Christiaan Simons lwIP为使用TCP/IP协议通信的应用程序编程提供了两 ...
- js中Date()对象详解
var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...