算法笔记-散列
- hash算法的思想
- 整数出现的个数
- 字符串出现个数
- 整数是否出现
- 整数出现的个数2
- 字符是否出现
- 字符串出现的个数
- 2-sum-hash
- 字符串出现的次数
- 集合求交
- 集合求并
- 集合求差
hash算法的思想
散列方法的主要思想是根据结点的关键码值来确定其存储地址
以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中。检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点。通过散列方法可以对结点进行快速检索。散列(hash,也称“哈希”)是一种重要的存储方式,也是一种常见的检索方法。
整数出现的个数
//整数出现的个数
//利用的hash思想
//因为输入的数据都没有超过100的,所以直接就是遍历所有的N
//设置一个数组hash,然后输入数据到里面,然后输出i(不为0),局可以输出
//然后输出个数
#include<iostream>
using namespace std;
const int N = 1001;
int hash[N] = {
0 };
int main()
{
int n;
cin >> n;
int x;
for (int i = 0; i < n; i++)
{
scanf_s("%d", &x);
hash[x]++;
}
for (int i = 0; i <= 100; i++)
{
if (hash[i])
{
printf("%d %d\n", i, hash[i]);
}
}
}
字符串出现个数
//先进行输入字符串,利用hash方法,需要确立两个点
//1.输入数据的范围
//2.全部hash数组确立的范围=数据的数目
//注意的点
//c++中定义和赋值一个字符串
//char a[10];
//cin >> a;
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N1 = 1001;
const int N2 = 26;
int get(char v)
{
return v- 'a';
}
int main()
{
int hash[N2] = {
0 };
char str[N1];
cin >> str;
int n = strlen(str);
for (int i = 0; i < n; i++)
{
hash[get(str[i])]++;
}
//从a开始到z结束,从26个字母中进行遍历了
for (char c = 'z'; c <= 'z'; c++)
{
if (hash[get(c)])
{
printf("%c %d", c, hash[get(c)]);//运用get函数表示的是输出有多少个相同的个数
}
}
return 0;
}
整数是否出现
注释:
整数是否出现,利用hash算法进行运算
先将hash数组全部赋值成false
然后再输出第一排数组中的数据,并且改成true
在输出下一组数组的时候,进行判断,如果在输出数据中hash是真的还是假的
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1001;
int main()
{
int hash[N] =