字符串哈希

Posted 508335848vf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串哈希相关的知识,希望对你有一定的参考价值。

字符串哈希

什么是字符串哈希?

概述:对字符串集合的单个字符串进行操作(配合数据结构或STL判重、统计、查询、修改等操作),在字符串集合中去寻找该字符串过程中,对字符串集合进行遍历和map映射在规模较大时都会浪费很多时间。字符串哈希是将单个字符串离散化映射为一个哈希值(哈希函数),在通过一些方式去解决冲突(不同的字符串可能对应相同的数值)后,使用哈希值找到该字符串,然后进行操作。

核心:哈希函数

  • 字符串str的哈希值hash(str)。
  • 为了减少碰撞,应该使该str中每个字符都参与哈希值计算。
  • 雪崩效应:只改变字符串中的一个字节,也会对最终的哈希值造成较大的影响。

同时哈希函数对应的结果一般都比较大,通过取余等方式来分配到一个合适的空间。

例题:HDU2648

技术图片

思路:简单hash,每一个字符串对应一个数值,一次更新操作,将所有的字符串全部加上某个价格,求解某个商店的排行。使用hash函数,映射字符串,同时取余分配到一个较小的空间,这样来每个店铺名称都对应一个位置,可以随机存取。该题难点在于解决冲突,在hash表上进行扩展,同样值得字符串,使用动态数组来增加,名字正确匹配之后进行操作解决冲突。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#define Max 10050
using namespace std;
struct Node {
	int price;
	string name;
};
int seed = 31;
int H(string s) {
	int key = 0;
	for (int i = 0; i < s.size(); i++) {
		key = key * seed + s[i];
	}
	return key & 0x7ffffff;
}
int main()
{
	vector<Node>List[Max];
	int n, m,len,price=0,rank,p[Max];
	Node t;

	while (cin >> n) {
		for (int i = 0; i < Max; i++) {
			List[i].clear();
		}
		for (int i = 1; i <= n; i++) {
			cin >> t.name;
			int key = H(t.name) % Max;
			t.price = 0;
			List[key].push_back(t);
		}
		cin >> m;
		for (int i = 1; i <= m; i++) {
			rank = 0;
			len = 0;
			for (int s = 1; s <= n; s++) {
				cin >> t.price >> t.name;
				int key = H(t.name) % Max;
				for (int j = 0; j < List[key].size(); j++) {
					if (List[key][j].name == t.name) {
						List[key][j].price += t.price;
						p[++len] = List[key][j].price;
						if (List[key][j].name == "memory")price = List[key][j].price;
						break;
					}
				} 
			}
			for (int j = 1; j <= len; j++) {
				if (p[j] > price) rank++;
			}
			cout << rank + 1 << endl;
		}
	}
}

技术图片

以上是关于字符串哈希的主要内容,如果未能解决你的问题,请参考以下文章

URL片段的最大长度(哈希)

URL的PHP​​和哈希/片段部分

从 URL 获取片段(哈希“#”后的值)[关闭]

带有哈希片段的锚未导航到匹配的 id

一致性哈希算法PHP测试片段

如何从 URL 获取片段标识符(哈希 # 后的值)?