/* @链表法解决hash冲突
* 大单元数组,小单元链表
*/
#pragma once
#include <string>
using namespace std; template<typename map_t>
struct Node
{
size_t key;
map_t content; Node *next;
bool isEmpty; Node():next(NULL),isEmpty(true){}
}; // 根据hash函数将content添加到hash表中
template<typename map_t>
class ListHash
{
public:
ListHash();
~ListHash(); bool insert(size_t key, const map_t& val);
bool find(size_t key, map_t& val);
bool erase(size_t key); private:
size_t hash(size_t key); private:
size_t m_nElementSize;
Node<map_t> *m_pNodeArray;
}; //////////////////////////实现/////////////////////////
template<typename map_t>
ListHash<map_t>::ListHash()
{
m_nElementSize = ;
m_pNodeArray = NULL;
m_pNodeArray = new Node<map_t>[m_nElementSize];
} template<typename map_t>
ListHash<map_t>::~ListHash()
{
delete[] m_pNodeArray;
m_pNodeArray = NULL;
} template<typename map_t>
size_t ListHash<map_t>::hash( size_t key )
{
return key % m_nElementSize;
} template<typename map_t>
bool ListHash<map_t>::insert( size_t key, const map_t& val )
{
size_t idx = hash(key);
Node<map_t> *pNode = &m_pNodeArray[idx];
if (m_pNodeArray[idx].isEmpty)
{
pNode->key = key;
pNode->content = val;
pNode->isEmpty = false;
pNode->next = NULL;
}
else
{
while (pNode->next != NULL)
{
pNode = pNode->next;
} Node<map_t> *pTempNode = new Node<map_t>;
pTempNode->key = key;
pTempNode->content = val;
pTempNode->isEmpty = false;
pTempNode->next = NULL; pNode->next = pTempNode;
} return true;
} template<typename map_t>
bool ListHash<map_t>::erase( size_t key )
{
size_t idx = hash(key);
Node<map_t> *pNode = &m_pNodeArray[idx];
Node<map_t> *pPrepNode = NULL; while (pNode!= NULL)
{
if (pNode->key == key)
{
if (pPrepNode)
{
pPrepNode->next = pNode->next;
}
delete pNode;
return true;
} pPrepNode = pNode;
pNode = pNode->next;
}
return false;
} template<typename map_t>
bool ListHash<map_t>::find( size_t key, map_t& val )
{
size_t idx = hash(key);
Node<map_t> *pNode = &m_pNodeArray[idx]; while (pNode!= NULL)
{
if (pNode->key == key)
{
val = pNode->content;
return true;
} pNode = pNode->next;
}
return false;
}

链表法解决hash冲突的更多相关文章

  1. 大厂面试必问!HashMap 怎样解决hash冲突?

    HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...

  2. 解决hash冲突之分离链接法

    解决hash冲突之分离链接法 分离链接法:其做法就是将散列到同一个值的所有元素保存到一个表中. 这样讲可能比较抽象,下面看一个图就会很清楚,图如下 相应的实现可以用分离链接散列表来实现(其实就是一个l ...

  3. 拉链法解决Hash节点冲突问题

    <?php /* * hash::拉链法解决hash节点存储冲突问题 * ::2014-07-02 * ::Small_Kind */ class small_hash { private $s ...

  4. 拉链法解决hashtable冲突问题

    拉链法解决冲突.拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表.如果不能理解我的文字 ...

  5. JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路

    JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起   ...

  6. 解决hash冲突的三个方法

    通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题.创建哈希表和查找哈希表都会遇到冲突,两种情况下解决冲突的方法应该一致.下面以创建哈希表为例,说 ...

  7. 解决hash冲突的三个方法(转)

    https://www.cnblogs.com/wuchaodzxx/p/7396599.html 目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公共溢出 ...

  8. 解决hash冲突方法

    转自:https://www.cnblogs.com/wuchaodzxx/p/7396599.html 目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公 ...

  9. 解决hash冲突的三个方法-考虑获取

    哈希表值的获取要考虑全部可能空间. 在链地址法中,可能空间就是具有相同hash值的链表.   目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公共溢出区 优 ...

随机推荐

  1. Elasticsearch Head插件实践

    简介 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Ap ...

  2. rabbitmq:centos7安装与python调用

    1.centos安装rabbitmq 官网下载或者yum list |grep rabbitmq搜索安装,官网是最新的版本 wget http://www.rabbitmq.com/releases/ ...

  3. windows PAE扩展和AWE编程

    在32位windows上只能看到最大3GB的内存空间,而且每个应用程序只能访问4GB的的内存,这个限制是windows独有的,为了使程序能够访问大于4GB的内存空间,需要使用AWE编程接口,同时需要开 ...

  4. HTML知识点总结之table

    table元素 table用来创建表格,表格也可以用来布局,但是嵌套过于复杂,不利于灵活布局,已经几乎没人用它来布局了. 表格基本上有如下几个标签构成: (1)<table>标签用来创建表 ...

  5. SLAM入门之视觉里程计(5):单应矩阵

    在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时 ...

  6. Es6主要特征详解

    一.简介 本文将对es6的最佳特性进行分享和讲解.es6也称ES6/ECMAScript2015,在2015年诞生,但是目前实际开发中还很多用的是ES5(2009年),原因就是很多的浏览器不支持新的语 ...

  7. linux交换空间

    swap空间有两种形式:一是交换分区,二是交换文件.总之对它的读写都是磁盘操作. linux内存通过 virtual memory 虚拟内存来管理整个内存, 虚拟内存管理着物理内存,也管理着swap交 ...

  8. cyclictest 简介

    1. cyclictest 简介以及安装 1.1 cyclictest 简介 cyclictest 是什么? 看名字应该就能大致猜出来它是一种 test 程序,Cyclictest的维基主页这么介绍它 ...

  9. TLD算法原理--学习理解之(二)

    正如名字所示,TLD算法主要由三个模块构成:追踪器(tracker),检测器(detector)和机器学习(learning). 对于视频追踪来说,常用的方法有两种,一是使用追踪器根据物体在上一帧的位 ...

  10. 重构仿vue社区代码

    半年前根据vue社区提供的开放api制作的vue社区,功能大部分和原vue社区一样,还一些功能没做完,项目是半年前做的,已经过了半年,当时因为公司一个项目打算要vue来重构,提取小试牛刀做了个dom试 ...