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

学院网站群建设方案网站悬浮窗口代码

学院网站群建设方案,网站悬浮窗口代码,宁波网站建设公司,网店美工课程心得体会哈希表(hash table)#xff0c;又称散列表#xff0c;其通过建立键 key 与值 value 之间的映射#xff0c;实现高效的元素查询。具体而言#xff0c;我们向哈希表输入一个键 key #xff0c;则可以在 \(O(1)\) 时间内获取对应的值 value 。 给定 n 个学生#xff0c;每个…哈希表(hash table)又称散列表其通过建立键 key 与值 value 之间的映射实现高效的元素查询。具体而言我们向哈希表输入一个键 key 则可以在 \(O(1)\) 时间内获取对应的值 value 。 给定 n 个学生每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个学号返回对应的姓名”的查询功能则可以采用下图所示的哈希表来实现。 除哈希表外数组和链表也可以实现查询功能它们的效率对比如下表所示。 添加元素仅需将元素添加至数组链表的尾部即可使用 \(O(1)\) 时间。查询元素由于数组链表是乱序的因此需要遍历其中的所有元素使用 \(O(n)\) 时间。删除元素需要先查询到元素再从数组链表中删除使用 \(O(n)\) 时间。 观察发现在哈希表中进行增删查改的时间复杂度都是 \(O(1)\) 非常高效。 10.1 哈希表常用操作 哈希表的常见操作包括初始化、查询操作、添加键值对和删除键值对等示例代码如下 /* 初始化哈希表 */ unordered_mapint, string map;/* 添加操作 */ // 在哈希表中添加键值对 (key, value) map[12836] 小哈; map[15937] 小啰; map[16750] 小算; map[13276] 小法; map[10583] 小鸭;/* 查询操作 */ // 向哈希表输入键 key 得到值 value string name map[15937];/* 删除操作 */ // 在哈希表中删除键值对 (key, value) map.erase(10583);哈希表有三种常用的遍历方式遍历键值对、遍历键和遍历值。示例代码如下 /* 遍历哈希表 */ // 遍历键值对 key-value for (auto kv: map) {cout kv.first - kv.second endl; } // 使用迭代器遍历 key-value for (auto iter map.begin(); iter ! map.end(); iter) {cout iter-first - iter-second endl; }10.2 哈希表简单实现 我们先考虑最简单的情况仅用一个数组来实现哈希表。在哈希表中我们将数组中的每个空位称为桶(bucket)每个桶可存储一个键值对。因此查询操作就是找到 key 对应的桶并在桶中获取 value 。 那么如何基于 key 定位对应的桶呢这是通过哈希函数(hash function)实现的。哈希函数的作用是将一个较大的输入空间映射到一个较小的输出空间。在哈希表中输入空间是所有 key 输出空间是所有桶数组索引。换句话说输入一个 key 我们可以通过哈希函数得到该 key 对应的键值对在数组中的存储位置。 输入一个 key 哈希函数的计算过程分为以下两步。 通过某种哈希算法 hash() 计算得到哈希值。将哈希值对桶数量数组长度capacity 取模从而获取该 key 对应的数组索引 index 。 index hash(key) % capacity随后我们就可以利用 index 在哈希表中访问对应的桶从而获取 value 。 设数组长度 capacity 100、哈希算法 hash(key) key 易得哈希函数为 key % 100 。图 6-2 以 key 学号和 value 姓名为例展示了哈希函数的工作原理。 以下代码实现了一个简单哈希表。其中我们将 key 和 value 封装成一个类 Pair 以表示键值对。 /* 键值对 */ struct Pair {public:int key;string val;Pair(int key, string val) {this-key key;this-val val;} };/* 基于数组实现的哈希表 */ class ArrayHashMap {private:vectorPair * buckets;public:ArrayHashMap() {// 初始化数组包含 100 个桶buckets vectorPair *(100);}~ArrayHashMap() {// 释放内存for (const auto bucket : buckets) {delete bucket;}buckets.clear();}/* 哈希函数 */int hashFunc(int key) {int index key % 100;return index;}/* 查询操作 */string get(int key) {int index hashFunc(key);Pair *pair buckets[index];if (pair nullptr)return ;return pair-val;}/* 添加操作 */void put(int key, string val) {Pair *pair new Pair(key, val);int index hashFunc(key);buckets[index] pair;}/* 删除操作 */void remove(int key) {int index hashFunc(key);// 释放内存并置为 nullptrdelete buckets[index];buckets[index] nullptr;}/* 获取所有键值对 */vectorPair * pairSet() {vectorPair * pairSet;for (Pair *pair : buckets) {if (pair ! nullptr) {pairSet.push_back(pair);}}return pairSet;}/* 获取所有键 */vectorint keySet() {vectorint keySet;for (Pair *pair : buckets) {if (pair ! nullptr) {keySet.push_back(pair-key);}}return keySet;}/* 获取所有值 */vectorstring valueSet() {vectorstring valueSet;for (Pair *pair : buckets) {if (pair ! nullptr) {valueSet.push_back(pair-val);}}return valueSet;}/* 打印哈希表 */void print() {for (Pair *kv : pairSet()) {cout kv-key - kv-val endl;}} };10.3 哈希冲突与扩容 从本质上看哈希函数的作用是将所有 key 构成的输入空间映射到数组所有索引构成的输出空间而输入空间往往远大于输出空间。因此理论上一定存在“多个输入对应相同输出”的情况。 对于上述示例中的哈希函数当输入的 key 后两位相同时哈希函数的输出结果也相同。例如查询学号为 12836 和 20336 的两个学生时我们得到 12836 % 100 36 20336 % 100 36如下图所示两个学号指向了同一个姓名这显然是不对的。我们将这种多个输入对应同一输出的情况称为哈希冲突(hash collision)。 容易想到哈希表容量 \(n\) 越大多个 key 被分配到同一个桶中的概率就越低冲突就越少。因此我们可以通过扩容哈希表来减少哈希冲突。 如下图所示扩容前键值对 (136, A) 和 (236, D) 发生冲突扩容后冲突消失。 类似于数组扩容哈希表扩容需将所有键值对从原哈希表迁移至新哈希表非常耗时并且由于哈希表容量 capacity 改变我们需要通过哈希函数来重新计算所有键值对的存储位置这进一步提高了扩容过程的计算开销。为此编程语言通常会预留足够大的哈希表容量防止频繁扩容。 「负载因子 load factor」是哈希表的一个重要概念其定义为哈希表的元素数量除以桶数量用于衡量哈希冲突的严重程度也常作为哈希表扩容的触发条件。例如在 Java 中当负载因子超过 \(0.75\) 时系统会将哈希表扩容至原先的2倍。
http://www.huolong8.cn/news/392625/

相关文章:

  • 在线生成网站做网站的公司主要做shm
  • 带dede后台的整套网站源码 数据库连接不上大连网站开发公司电话
  • 在vs中做网站做网站怎么云存储
  • 健康网站可以做推广吗海南省交通建设局网站首页
  • 做数据收集网站3d建模软件下载
  • 网站建设流程报告重庆品牌网站建设
  • 南京哪里有做网站的旅游网站开发的背景和意义
  • 线下推广活动从哪些方面做好网站的seo
  • 免费商城网站模板下载1688官网首页
  • 新网站多久会被百度收录西安企业建站价格
  • 国外网站建设发展现状做国际贸易哪个网站比较好
  • 专业柳州网站建设公司松江网站建设推广
  • 免费建站模板网站淘宝客wordpress末班
  • 最威海的网站建设官方模板关键字生成的代码添加在网站的什么地方?
  • wordpress中文书籍seo包年优化费用
  • 五合一小程序网站网页编辑布局在线
  • 怎么把网站链接做二维码项目拉新平台
  • 如何用vs的c 做网站短链接在线生成器
  • 做视频资源网站有哪些内容专门做验收报告的网站
  • 九江专业的企业网站建设公司网站后期维护内容
  • 上海城乡建设学校网站网站开发表格整体页面居中
  • 公司搭建一个网站需要多少钱黑群晖搭建wordpress外网访问
  • 什么类型的网站容易做微网站设计基本要求
  • 建网站 3年服务网站建设立项
  • 手机可播放的网站做视频网站需要什么证件
  • 太原市建设厅网站首页东莞营销策划推广公司
  • 网站建设福建摄影网站免费
  • 清徐网站建设郑州市建设集团
  • 值得相信的西安网站开发南京做网站公司 雷仁
  • 建设银行网站为什么进不去上海有几个区最好