当前位置: 首页 > wzjs >正文

网站商业授权为什么做腾讯网站

网站商业授权,为什么做腾讯网站,手机如何制作软件app,江宁建设局网站🌟 Hash 表入门详解:原理 开放定址 双散列(含 C 示例) 哈希表(Hash Table)是一种支持快速插入、删除、查找的高效数据结构,几乎所有编程语言都内置了它的变体(如 C 的 unordered_m…

🌟 Hash 表入门详解:原理 + 开放定址 + 双散列(含 C++ 示例)

哈希表(Hash Table)是一种支持快速插入、删除、查找的高效数据结构,几乎所有编程语言都内置了它的变体(如 C++ 的 unordered_map、Java 的 HashMap)。
本文将通过直观类比 + C++ 示例代码,带你从 0 理解哈希表,特别是 开放定址法与双散列技术


在这里插入图片描述

🧠 一、哈希表的基本思想:映射存储

📦 类比:图书馆中找书

假设你在图书馆找书:

  • 正常做法:挨本翻,效率极低;
  • 聪明做法:根据书的编号 → 找到固定书架位置

哈希表也是这样:

把“键值”通过某种规则变成数组下标 —— 哈希函数(Hash Function),然后把值存在这个位置上。


📐 二、哈希函数:让钥匙变成下标

最常用的哈希函数之一是:

h(k) = k % m
  • k: 关键字(如学号、身份证号等)
  • m: 哈希表大小(通常为质数)
  • %: 取余操作,相当于“将所有键值均匀撒到 0~m-1 中”。

示例:

k = 1234, m = 10
h(k) = 1234 % 10 = 4

👉 把编号 1234 的学生记录存到数组下标为 4 的位置。


💥 三、冲突了怎么办?(关键)

🎯 什么是冲突?

不同的 k,可能通过哈希函数算出的下标一样,称为哈希冲突(collision)

比如:

h(1234) = 4
h(5674) = 4   // 冲突了!

🔁 四、解决冲突:开放定址法(Open Addressing)

✨ 思路:

如果目标位置被占,就往后找空位。

📊 常见策略:

策略名探测方式示例(已知 h(k)=4)
线性探测i 次冲突后,检查 (h(k) + i) % m4, 5, 6, 7…
平方探测h(k) + i²4, 5, 8, 13…
🔥 双散列法h(k) + i × h2(k)4, 4+h2, 4+2×h2…

🚀 五、重点:双散列法(Double Hashing)

双散列是一种冲突更少、分布更好的方法,避免“堆积”效应。

📌 双散列公式:

Hi = (hash1(k) + i × hash2(k)) % m
  • hash1(k):主哈希函数,一般是 k % m
  • hash2(k):副哈希函数,常见是 c - (k % c),其中 c 是小于 m 的质数

这样可以跳跃式探测空位,不容易发生“线性堆积”。


✅ 六、完整 C++ 示例:双散列插入与查找

#include <iostream>
#include <vector>
using namespace std;const int TABLE_SIZE = 11; // 哈希表大小
const int C = 7;           // 小于表长的质数,用于双散列class HashTable {
private:vector<int> table;vector<bool> occupied;int hash1(int key) {return key % TABLE_SIZE;}int hash2(int key) {return C - (key % C);}public:HashTable() : table(TABLE_SIZE, -1), occupied(TABLE_SIZE, false) {}// 插入元素void insert(int key) {int h1 = hash1(key);int h2 = hash2(key);for (int i = 0; i < TABLE_SIZE; i++) {int index = (h1 + i * h2) % TABLE_SIZE;if (!occupied[index]) {table[index] = key;occupied[index] = true;cout << "插入 " << key << " 到位置 " << index << endl;return;}}cout << "插入失败,表已满\n";}// 查找元素int search(int key) {int h1 = hash1(key);int h2 = hash2(key);for (int i = 0; i < TABLE_SIZE; i++) {int index = (h1 + i * h2) % TABLE_SIZE;if (!occupied[index]) return -1;if (table[index] == key) return index;}return -1;}// 打印哈希表void print() {for (int i = 0; i < TABLE_SIZE; i++) {cout << i << ": " << (occupied[i] ? to_string(table[i]) : "空") << endl;}}
};int main() {HashTable ht;// 插入一些元素ht.insert(10);ht.insert(21);ht.insert(32);ht.insert(43); // 冲突,尝试双散列探测ht.print();// 查找测试int key = 21;int idx = ht.search(key);if (idx != -1)cout << "找到 " << key << " 在位置 " << idx << endl;elsecout << "未找到 " << key << endl;return 0;
}

📊 七、性能分析简述

  • 装填因子 α = 已存元素个数 / 表长
  • α 越大,冲突越多,性能下降。
  • 双散列在开放定址中是性能最优的探测方式之一。
  • 在 α < 0.7 时,平均查找长度 ≈ 1~2 次探测。

🎁 八、小结 & 建议

内容
核心结构哈希表 = 数组 + 哈希函数
冲突解决开放定址法 + 双散列
实战技巧表长 m 选质数,hash2(k) 要与 m 互素
性能建议控制装填因子 < 0.7,避免频繁冲突

http://www.dtcms.com/wzjs/790125.html

相关文章:

  • 如何做的网站手机可以用吗织梦cms网站地图
  • 网站布局教程企业网站 更新 seo
  • 晋江做网站的公司哪家好仿站容易还是建站容易
  • 上海住房与建设部网站个人网站效果图咋做
  • 百度公司网站推广怎么做网站开发应该怎么做
  • 多屏网站建设装饰公司经营范围
  • 传媒公司制作网站做网站去哪推广好
  • 益阳网站建设asp网站搭建教程
  • 建网站 备案爱城市网官方下载
  • 邢台做wap网站价格和平网站建设公司
  • 培训教育网站开发网站建设实验七
  • 网站建设与制作视频教学百度经验登录入口
  • 官方网站开发需要几个技术人员网页美工设计实训中职期末试卷
  • 英国做电商网站有哪些咨询类网站模板
  • 网络平台设计开发遂宁网站seo
  • 提供网站建设搭建自己建网站卖东西
  • 开发wap网站 转dnf怎么做盗号网站
  • 建立网站需要准备的材料如何使用腾讯云建网站
  • 顺德网站建设基本流程学生网页设计成品网站
  • 网站建设用哪个app平泉县住房和城乡建设局网站
  • 个人做论坛网站需要哪些备案百度电脑版网页版入口
  • 网站开发工程师就业前景英德住房和城乡建设局网站
  • 做平台网站怎么赚钱利用电脑做网站
  • 做网站合同模板两学一做专题网站用途
  • 自己做网站用哪个软件岳阳seo公司咨询23火星
  • 湛江定制建站企业网站资源网
  • 百度个人网站申请怎么找做企业网站的
  • 企业服务网站制作免费一键生成短链接
  • 为什么大网站的百度快照更新速度慢还排第一广州定制网页设计
  • 做楼盘网站做网站机构图用什么工具