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

cms企业网站模板设计公司网站设计

cms企业网站模板,设计公司网站设计,网站建设与管理适合男的还是女的,域名请记住222922目录 引入 开散列的底层实现 哈希表的定义 哈希表的扩容 哈希表的插入 哈希表查找 哈希表的删除 引入 接上一篇,我们使用了闭散列的方法解决了哈希冲突,此篇文章将会使用开散列的方式解决哈希冲突,后面对unordered_set和unordered_map的…

目录

引入

 开散列的底层实现

哈希表的定义

哈希表的扩容

哈希表的插入

哈希表查找

哈希表的删除


引入

接上一篇,我们使用了闭散列的方法解决了哈希冲突,此篇文章将会使用开散列的方式解决哈希冲突,后面对unordered_set和unordered_map的封装也会用开散列的哈希表实现。

开散列,也叫哈希桶和拉链法,其数组中存储的不再是单个数据,而是一个个的节点指针。通过将数据映射到对应位置后,插入到链表中去。

闭散列就像一个个的链表挂在数组上。 


 开散列的底层实现

与闭散列不同的是,开散列哈希表中存储的是节点,不再是具体数据;也不许需要再存储状态,只需要存储下一个指针即可。

哈希表的定义

template<class K,class V>
struct HashNode
{//默认构造HashNode(const pair<K,V>& kv=pair()):_kv(kv),next(nullptr){ }pair<K, V> _kv;HashNode* _next;
};template<class K,class V>
class HashTable
{typedef HashNode<K, V> Node;
public://默认构造HashTable(){_table.resize(10);  //初始情况下数组有10个空间_n = 0;}private:vector<Node*> _table;size_t _n;   //存储有效数据
};

哈希表的扩容

开散列在插入时,像闭散列一样也要检查载荷因子时候满足条件。开散列的载荷因子没有闭散列那么严格,开散列的载荷因子要求小于1即可,平均每条链有一个数据。

在扩容后也需要对数据进行重新插入。

扩容方法:创建新的哈希表,将原数据的节点一个个的插入到新数组中,再将两个数组进行交换。

//扩容
void More()
{if ((double)_n / _table.size() >= 1){//进行扩容HashTable newtable;size_t newsize = 2 * _table.size();newtable._table.resize(newsize);  //扩容两倍扩size_t hashi = 0;while (hashi < _table.size()){if (_table[hashi]){//将数据进行头插Node* pcur = _table[hashi];while (pcur){Node* next = pcur->_next;pcur->_next = newtable._table[hashi];newtable._table[hashi] = pcur;pcur = next;}}hashi++;}_table.swap(newtable._table);}
}

哈希表的插入

//插入
bool insert(const pair<K, V>& kv)
{//扩容More();size_t hashi = kv.first % _table.size();Node* newnode = new Node(kv);//将数据头插到对应映射的位置newnode->_next = _table[hashi];_table[hashi] = newnode;_n++;return true;
}

哈希表查找

先找到映射的位置,在对应位置的链表中查找。

//查找
bool Find(const K& key)
{size_t hashi = key % _table.size();Node* pcur = _table[hashi];while (pcur){if (pcur->_kv.first == key){return true;}pcur = pcur->_next;}return false;
}

哈希表的删除

哈希表的删除比较简单:直接将该节点的前后指针连起来即可。

//删除
bool Erase(const K& key)
{size_t hashi = key % _table.size();Node* pcur = _table[hashi];Node* parent = nullptr;while (pcur){if (pcur->_kv.first == key){if (parent == nullptr){delete pcur;pcur = nullptr;_table[hashi] = nullptr;}else{parent->_next = pcur->_next;delete pcur;}return true;}pcur = pcur->_next;}return false;
}

到此,哈希表的开散列的基本实现已经完成。还有一些具体细节将在《哈希表的封装》中进行具体分析。

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

相关文章:

  • 个人网站开发制作论文web关键词优化排名第一
  • 常州网站制作包括哪些绍兴seo
  • 私人怎么做彩票网站平台av手机在线精品
  • 关键词优化提升排名关键词seo排名怎么选
  • 专业做私募网站汕头网站设计
  • 宠物店网站建设方案友点企业网站管理系统
  • 长春电商网站建设公司常州网络推广平台
  • 烟台建站软件百度搜索引擎推广怎么弄
  • 公司网站建设需要收集什么信息百度推广代理怎么加盟
  • 做热区的网站门户网站怎么做
  • 精品网站要建设需要多少钱电话百度
  • 珠海网站建设报价中国百强县市榜单
  • 凉山网站建设2021年近期舆情热点话题
  • 西宁建设网站价格低想找搜索引擎优化
  • 如何做网站首页收录企业营销型网站
  • 大学生做外包项目的网站竞价推广课程
  • 做实验的网站河源今日头条新闻最新
  • 丹凤县人民政府门户网站建设中国教师教育培训网
  • 行业seo网站优化方案短网址生成网站
  • 上海手机网站案例360营销
  • 日照网站建设公司软文广告经典案例100字
  • 做网站 徐州网上推广赚钱项目
  • 昆明哪里做网站微信广点通广告平台
  • 怎么查网站备案的公司近期国际热点大事件
  • 中小企业外贸网站建设现状百度关键词优化送网站
  • 空间网站建设靠谱的广告联盟
  • 网站赌博做庄是怎样做济南seo外包服务
  • discuz注册搜索引擎优化岗位
  • 海南建设培训与执业中心网站百度快照怎么发布
  • 政府采购网广东分网优化疫情二十条措施