链表法解决hash冲突
/* @链表法解决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冲突的更多相关文章
- 大厂面试必问!HashMap 怎样解决hash冲突?
HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...
- 解决hash冲突之分离链接法
解决hash冲突之分离链接法 分离链接法:其做法就是将散列到同一个值的所有元素保存到一个表中. 这样讲可能比较抽象,下面看一个图就会很清楚,图如下 相应的实现可以用分离链接散列表来实现(其实就是一个l ...
- 拉链法解决Hash节点冲突问题
<?php /* * hash::拉链法解决hash节点存储冲突问题 * ::2014-07-02 * ::Small_Kind */ class small_hash { private $s ...
- 拉链法解决hashtable冲突问题
拉链法解决冲突.拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表.如果不能理解我的文字 ...
- JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路
JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起 ...
- 解决hash冲突的三个方法
通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题.创建哈希表和查找哈希表都会遇到冲突,两种情况下解决冲突的方法应该一致.下面以创建哈希表为例,说 ...
- 解决hash冲突的三个方法(转)
https://www.cnblogs.com/wuchaodzxx/p/7396599.html 目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公共溢出 ...
- 解决hash冲突方法
转自:https://www.cnblogs.com/wuchaodzxx/p/7396599.html 目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公 ...
- 解决hash冲突的三个方法-考虑获取
哈希表值的获取要考虑全部可能空间. 在链地址法中,可能空间就是具有相同hash值的链表. 目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公共溢出区 优 ...
随机推荐
- PyQt4 的事件与信号 -- 发射信号
继承自QtCore.Qobject的对象均可以发射信号. 如果我们单击一个按钮,那么一个clicked()信号就会被触发. 以下代码将演示如果手动发射一个信号. import sys from PyQ ...
- SpringMVC handleMapping 处理器映射器 属性清单
映射器的属性清单 defaultHandler 在映射与所有处理器都不匹配的情况下,指定默认的处理器(处理器即你定义的Controller(action)类) order ...
- SLAM入门之视觉里程计(5):单应矩阵
在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时 ...
- Go 语言打包静态文件
对于 Go 语言开发者来说,在享受语言便利性的同时,最终编译的单一可执行文件也是我们所热衷的.但是,一旦遇到我们需要分发的东西不只有可执行文件的时候,事情就变得稍微有点复杂了,例如,需要分发个默认的配 ...
- Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器
Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器 闲着无聊的时候部署了一个Django项目玩,用vm虚拟机部署的. 准备工作 我使用的系统是Ubuntu16 ...
- Kotlin——从无到有系列教程(5): 你该知道的Kotlin可空类型、空安全(null)、类型转换等特性
在我们熟知的Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null. ...
- 五分钟学习React(四):什么是JSX
JSX,即javscript XML,是js内定义的一套XML语法.目前是使用babel作为JSX的编译器.这也是在前几期中载入babel的原因. Facebook引入JSX是为了解决前端代码工程复杂 ...
- [搬运] 写给 C# 开发人员的函数式编程
原文地址:http://www.dotnetcurry.com/csharp/1384/functional-programming-fsharp-for-csharp-developers 摘要:作 ...
- 【三十一】thinkphp之安装、配置、模块化及URL模式
一:安装与配置 1.获取ThinkPHP 下载地址:http://www.thinkphp.cn/down.html 2.入口文件 ThinkPHP采用单一入口模式对项目进行部署和访问,所以我们需要通 ...
- 初识DJango——MTV模型
一.Django—MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻 ...