[无讲解] 字符串哈希 模板

本文分享了一段使用双哈希算法解决洛谷模板题目的实战代码。该代码通过两次哈希运算来确保字符串匹配的准确性,并最终输出不重复字符串的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存一下自己用的代码

哈希讲解百度上多得是 =-=

题目是洛谷模板 这里采用双哈希 跑了1000ms =-= 懒得优化了

#include <algorithm>
#include <cstring>
#include <cstdio>
#define mod1 2147483647ll
#define mod2 1234567891ll
using namespace std;
typedef unsigned long long ull;
struct answer {
	ull x,y;
} ans[10010];
ull base = 127;
bool cmp(answer a,answer b)
{
	return a.x < b.x;
}
int main()
{
	int n,tot = 1;
	scanf("%d",&n);
	for (int a = 1 ; a <= n ; ++ a)
	{
		char q[1 << 11];
		scanf("%s",q);
			for (int b = 0 ; b < strlen(q) ; ++ b)
			{
				ans[a].x = (ans[a].x * base + (ull)q[b]) % mod1;
				ans[a].y = (ans[a].y * base + (ull)q[b]) % mod2;
			}
	}
	sort(ans + 1,ans + n + 1,cmp);
	for (int a = 1 ; a < n ; ++ a)
	if (ans[a].x != ans[a + 1].x || ans[a].y != ans[a + 1].y) ++tot;
	printf("%d\n",tot);
	return 0;
}

 

6/2025 MP4 出版 |视频: h264, 1280x720 |音频:AAC,44.1 KHz,2 Ch 语言:英语 |持续时间:12h 3m |大小: 4.5 GB 通过实际 NLP 项目学习文本预处理、矢量化、神经网络、CNN、RNN 和深度学习 学习内容 学习核心 NLP 任务,如词汇切分、词干提取、词形还原、POS 标记和实体识别,以实现有效的文本预处理。 使用 One-Hot、TF-IDF、BOW、N-grams 和 Word2Vec 将文本转换为向量,用于 ML 和 DL 模型。 了解并实施神经网络,包括感知器、ANN 和数学反向传播。 掌握深度学习概念,如激活函数、损失函数和优化技术,如 SGD 和 Adam 使用 CNN 和 RNN 构建 NLP 和计算机视觉模型,以及真实数据集和端到端工作流程 岗位要求 基本的 Python 编程知识——包括变量、函数和循环,以及 NLP 和 DL 实现 熟悉高中数学——尤其是线性代数、概率和函数,用于理解神经网络和反向传播。 对 AI、ML 或数据科学感兴趣 – 不需要 NLP 或深度学习方面的经验;概念是从头开始教授的 描述 本课程专为渴望深入了解自然语言处理 (NLP) 和深度学习的激动人心的世界的人而设计,这是人工智能行业中增长最快和需求最旺盛的两个领域。无论您是学生、希望提升技能的在职专业人士,还是有抱负的数据科学家,本课程都能为您提供必要的工具和知识,以了解机器如何阅读、解释和学习人类语言。我们从 NLP 的基础开始,从头开始使用文本预处理技术,例如分词化、词干提取、词形还原、停用词删除、POS 标记和命名实体识别。这些技术对于准备非结构化文本数据至关重要,并用于聊天机器人、翻译器和推荐引擎等实际 AI 应用程序。接下来,您将学习如何使用 Bag of Words、TF-IDF、One-Hot E
内容概要:本文全面介绍了虚幻引擎4(UE4)的功能、应用场景、学习准备、基础操作、蓝图系统、材质与纹理、灯光与渲染等方面的内容。UE4是一款由Epic Games开发的强大游戏引擎,支持跨平台开发,广泛应用于游戏、虚拟现实、增强现实、建筑设计等领域。文章详细阐述了学习UE4前的硬件和软件准备,包括最低和推荐配置,以及Epic Games账户创建、启动器安装等步骤。接着介绍了UE4的界面组成和基本操作,如视口、内容浏览器、细节面板等。蓝图系统作为UE4的可视化脚本工具,极大降低了编程门槛,通过实例演练展示了蓝图的应用。材质与纹理部分讲解了材质编辑器的使用和纹理导入设置,灯光与渲染部分介绍了不同类型的灯光及其应用,以及后期处理和高质量图片渲染的方法。最后推荐了一些学习资源,包括官方文档、教程网站、论坛社区和书籍。 适合人群:对游戏开发感兴趣、希望学习UE4的初学者和有一定编程基础的研发人员。 使用场景及目标:①掌握UE4的基本操作和界面认知,为后续深入学习打下基础;②通过蓝图系统快速创建游戏逻辑,降低编程门槛;③学会材质与纹理的创建和设置,提升游戏画面的真实感;④掌握灯光与渲染技术,营造逼真的游戏氛围;⑤利用推荐的学习资源,加速UE4的学习进程。 阅读建议:本文内容详尽,涵盖了UE4的各个方面,建议读者按照章节顺序逐步学习,先从基础操作入手,再深入到蓝图、材质、灯光等高级功能。在学习过程中,结合实际项目进行练习,遇到问题时参考官方文档或社区论坛,不断积累经验和技能。
<think>好的,我现在需要帮助用户了解C++中哈希函数的实现和使用。首先,我需要回顾用户之前的对话和提供的引用内容,确保回答的一致性和准确性。 用户之前的问题是关于C++哈希表的整体使用和实现,现在他们特别关注哈希函数的部分。根据用户提供的引用,引用[2]详细解释了哈希函数的作用,特别是字符串的处理,比如使用33作为基数计算哈希值。而引用[1]和[3]提到了C++中哈希表的基本使用和标准库的实现,比如unordered_map和unordered_set。 首先,我需要明确哈希函数在C++中的角色:将不同类型的键转换为整数,以便在哈希表中定位存储位置。用户可能想知道如何自定义哈希函数,特别是处理自定义类型或字符串的情况。根据引用[2],字符串哈希函数通常使用多项式累加,如BKDR算法,这里提到了33和131作为乘数,这可能需要在回答中举例说明。 接下来,用户可能对C++标准库中的哈希函数实现感兴趣。根据引用[3],C++11引入了unordered系列容器,这些容器使用默认的哈希函数,但对于字符串,标准库可能有特定的实现。需要解释如何查看标准库中的默认哈希函数,以及如何针对自定义类型进行特化或重载。 另外,用户可能想知道如何解决哈希冲突的问题。虽然哈希函数的设计是关键,但引用[1]和之前的回答提到了链地址法和开放寻址法。这里需要强调哈希函数在减少冲突中的作用,比如均匀分布和减少碰撞概率。 用户可能还会有性能方面的考虑,比如如何选择好的哈希函数来优化查找效率。根据之前的回答,负载因子和扩容策略也是影响因素,但这里应聚焦在哈希函数本身的设计上,比如选择较大的质数作为乘数,或者处理字符串时的技巧。 现在需要组织回答的结构,可能分为基本实现、字符串处理、自定义类型、标准库的使用和常见问题。确保每个部分都有代码示例,例如如何为自定义类重载哈希函数,或者如何特化std::hash模板。 还要注意引用之前的引用内容,比如引用[2]中的哈希函数示例,需要在回答中提及,并正确添加引用标记。同时,用户之前的回答提到了BKDR算法,这里需要保持一致,并解释为什么选择特定的乘数,如131或33,以及它们对分布的影响。 最后,考虑用户可能的后续问题,比如如何处理哈希冲突、性能调优,或者在不同场景下的最佳实践,因此在相关问题部分需要包含这些内容,以引导用户深入理解。</think>### C++哈希函数实现与使用详解 #### 一、哈希函数核心作用 哈希函数是哈希表的核心组件,负责将任意类型键值转换为固定范围的整型索引,公式表示为: $$ \text{index} = H(key) \% \text{bucket\_size} $$ 其设计直接影响哈希表性能,理想情况应满足**均匀性**和**低碰撞率**[^2] --- #### 二、C++标准库实现 ##### 1. 基础类型默认支持 标准库为基本类型预置了哈希特化版本: ```cpp #include <functional> std::hash<int> intHash; size_t index = intHash(42) % 100; // 计算42的哈希值 ``` ##### 2. 字符串哈希实现 STL采用改进的**FNV算法**,实际代码示例: ```cpp // GCC标准库实现片段 template<> struct hash<string> { size_t operator()(const string& s) const { size_t h = 0; const char* str = s.c_str(); for (; *str; ++str) h = 5 * h + *str; // 实际采用5进制累积 return h; } }; ``` *注:不同编译器实现细节可能不同[^3]* --- #### 三、自定义哈希函数 ##### 1. 结构体/类哈希实现 **方法一:特化std::hash** ```cpp struct Point { int x, y; }; template<> struct std::hash<Point> { size_t operator()(const Point& p) const { return (p.x << 16) | p.y; // 位运算组合坐标 } }; unordered_set<Point> points; // 直接使用 ``` **方法二:自定义函数对象** ```cpp struct PersonHash { size_t operator()(const Person& p) const { return hash<string>()(p.name) ^ (hash<int>()(p.age) << 1); } }; unordered_map<Person, string, PersonHash> mapping; ``` ##### 2. 优化字符串哈希 采用**BKDR算法**(引用[2]的优化版本): ```cpp size_t BKDRHash(const string& s) { size_t seed = 131; // 31/131/1313等质数 size_t hash = 0; for(char c : s) { hash = hash * seed + c; } return hash; } ``` *该算法在多个开源项目中验证有效[^2]* --- #### 四、关键使用技巧 1. **碰撞概率控制** - 使用质数作为哈希表容量(如127/1021等) - 混合高位与低位比特: ```cpp // 来自Boost库的哈希组合方法 template <class T> inline void hash_combine(size_t& seed, const T& v) { seed ^= std::hash<T>()(v) + 0x9e3779b9 + (seed<<6) + (seed>>2); } ``` 2. **性能对比测试** ```cpp // 测试不同哈希函数分布均匀性 void testHashDistribution() { vector<int> counts(100, 0); auto hashFunc = BKDRHash; // 更换不同哈希函数测试 for(int i=0; i<100000; ++i) { string key = generateRandomString(10); size_t idx = hashFunc(key) % 100; counts[idx]++; } // 输出统计标准差... } ``` --- #### 五、典型应用场景 1. **快速数据检索** ```cpp unordered_map<string, Employee, BKDRHash> employeeDB; ``` 2. **数据校验** ```cpp size_t fileHash = computeFileHash("data.bin"); if(fileHash != expectedHash) throw "数据被篡改!"; ``` 3. **负载均衡** ```cpp size_t serverIdx = hash<UserID>()(uid) % serverCount; ``` --- #### 六、常见问题解决方案 **Q1 哈希值重复问题?** - 使用双重哈希:$H_1(key) + i*H_2(key)$ - 增加盐值扰动:$hash = hash \oplus salt$ **Q2 如何验证哈希函数质量?** - 计算碰撞次数 - 进行卡方检验(Chi-square test) - 可视化分布直方图 ```cpp // 示例:计算哈希冲突次数 template<typename HashFunc> int countCollisions(const vector<string>& keys, HashFunc hf) { unordered_map<size_t, int> counter; for (auto& key : keys) { size_t hash = hf(key); counter[hash]++; } int collisions = 0; for (auto& pair : counter) { if (pair.second > 1) collisions += pair.second - 1; } return collisions; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值