1.解释:使用了映射函数,把值映射到对应的位置,key-> address, address是表中的存储位置,不是实际的地址;
2.Hash 函数设计, 分布合理,冲突少,利用率平衡,利用率高了,冲突多,利用率低了,冲突小点;
(1)直接定址发:
address(key) = key -2000
(2)平方取中法, 对关键字进行平方运算,然后取中间的几个数字做为hash地址
address(key) =str( math.pow(key, 2) )[2, -2]
(3)折叠法, 关键的字做一个运算
address(key) = key[0] + key[1] + key[2]
(4)除留取余
知道hash表带最大长度m, 取不大于m的质数p,对关键字进行取余运算
address(key) = key%p
p的选取很重要,因为p选择的好,可以最大限度降低冲突,p一般选择小于m的最大质数
3.Hash表的大小选择;
(1)根据存储的数量和分布来选择;
(2)动态分配,这时候需要重新计算hash地址;redis 中就有这种模式
4.冲突解决;
(1)开发定址法:冲突后按照一定的策略需要寻找空位

(2)链地址法:链地址法
5.hashtable 的桶数选择质数的原因
该段摘自http://blog.csdn.net/liuqiyao_01/article/details/14475159
设有一个哈希函数

H( c ) = c % N;
当N取一个合数时,最简单的例子是取2^n,比如说取2^3=8,这时候
H( 11100(二进制) ) = H( 28 ) = 4

H( 10100(二进制) ) = H( 20 )= 4
这时候c的二进制第4位(从右向左数)就”失效”了,也就是说,无论第c的4位取什么值,都会导致H( c )的值一样.这时候c的第四位就根本不参与H( c )的运算,这样H( c )就无法完整地反映c的特性,增大了导致冲突的几率.
取其他合数时,都会不同程度的导致c的某些位”失效”,从而在一些常见应用中导致冲突.
但是取质数,基本可以保证c的每一位都参与H( c )的运算,从而在常见应用中减小冲突几率.
下面是自己实现的一个简单的hashTable, 很多问题没有考虑进去,也没有编译测试,仅作为理解
如果想看C++ STL源码,可以参考
https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.1/hashtable-source.html
http://blog.csdn.net/KangRoger/article/details/38640943
#include <stdio.h>#define M 100
#define Hash_key = 29template <class T>
struct HashNode
{T data;int key;int isNull;HashNode<T>* pNext;HashNode(){pNext = NULL;isNull = 1;}
}; template <class T>
class HashTable
{
private:HashNode<T> m_HashNodes[M];int getHashAddress(int key) {return key % Hash_key;}public:HashTable(){// for (i=0; i<M; i++) {//     m_HashNodes[i].isNull = 0;    // }
    }bool insert(int key,T data) {int address = this.getHashAddress(key);if (m_HashNodes[address].isNull == 1) {m_HashNodes[address].data = data;m_HashNodes[address].isNull == 0;}else {// while (m_HashNodes[address].isNull == 0 && address <M) { // 线性探测法, 开发地址法//     address++;// }// if (address == M) {//     return false;// }// HashNode<T>* pTmpNode = m_HashNodes[address].pNext; // 链地址法HashNode<T>* pCurNode = NULLwhile (pTmpNode != NULL) {pCurNode = pTmpNode;pTmpNode = pTmpNode->pNext;}pCurNode->pNext = new HashNode<T>();pCurNode->pNext->data = data;pCurNode->pNext->key = key;pCurNode->pNext->isNull = 0;}}HashNode<T> find(int key) {int address = this.getHashAddress(key);HashNode<T> node = m_HashNodes[address];if (node.key == key){return &node.data;}else {pCur = m_HashNodes[address].pNext;while (pCur != NULL){if (pCur->key == key) {return pCur;}else {pCur = pCur->pNext;}    }return NULL}}}

转载于:https://www.cnblogs.com/suyuan1573/p/6071295.html

HashTable 简述相关推荐

  1. Hashtable简述

           散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映 ...

  2. 在C#中应用哈希表(Hashtable)

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其 ...

  3. C#中HashTable的用法

    1. 哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值对, ...

  4. C#中Hashtable表的应用

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...

  5. .Net下的HashTable

    一,哈希表(Hashtable)简述       在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value ...

  6. C# 集合类(四):Hashtable

    一.哈希表(Hashtable)简述      在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的 ...

  7. C# HashTable 使用用法详解

    C#中如何操作HashTable类呢?本文将给你答案,哈希表(Hashtable)简述在.NET Framework中, 一,Hashtable是System.Collections命名空间提供的一个 ...

  8. C# hashtable

    Hashtable 一,哈希表(Hashtable)简述 在.NET work中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/的键值对,其 ...

  9. C#中哈希表(HashTable)的用法详解

    1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...

  10. 聊聊C# 中HashTable与Dictionary的区别说明

    哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中ke ...

最新文章

  1. DevExpress最强干货|实用示例、更新等你来体验!
  2. spring中那些让你爱不释手的代码技巧
  3. SNMP协议介绍和操作截图
  4. java仿聊天室项目总结_Java团队课程设计-socket聊天室(个人总结)
  5. 瑞星2008网络版序列号大全
  6. MySQL数据库模式(SQL_MODE)中的STRICT_TRANS_TABLES和STRICT_ALL_TABLES
  7. Windows Phone 内容滑动切换实现
  8. 第十八期:网页禁止复制粘贴怎么办?教你六招轻松搞定
  9. matlab 图像矢量量化,MATLAB环境下基于矢量量化的说话人识别系统(1)
  10. 手机里的html文档是什么,华为手机中后面带HTML的文档能删除吗?
  11. Problem C(HDU-5687)
  12. [Erlang危机](4.4)命名管道
  13. 慎用javascript:void(0) 【转】
  14. Ubuntu12.04安装配置Nginx Tomcat环境
  15. 父与子python下载不了_【求助】看父与子学习Python,里面有一个滑雪小游戏,加载不出图...
  16. ax200 兼容性问题 老路由器_WiFi6来了!但我们究竟应不应该换哥新的路由器呢
  17. Cannot resolve plugin org.apache.tomcat.maven:tomcat7-maven-plugin:<unknown>
  18. atmega128 单片机 密码锁 PROTEUS 仿真
  19. simulink中不能改名_王者荣耀:万格改名教学,空白名、重复名、个性符号名改法技巧!...
  20. HTML是什么?有什么作用?

热门文章

  1. Scikit-learn:聚类clustering
  2. Pytorch完成线性回归
  3. python高阶函数map reduce filter sorted_【Python入门】7.高阶函数之 map( )、reduce( )、filter( )、sorted( )的用法...
  4. 软件测试--缺陷报告常见问题03
  5. Web — 调色盘打开+div
  6. L1-042 日期格式化 (5 分)—团体程序设计天梯赛
  7. Linux查看磁盘空间和文件夹大小
  8. JEE5标准与Struts/Spring/Hibernate等诸多开源框架的比较分析
  9. 概率分布与马尔科夫链的关系讨论(上传费事)
  10. [World Final 2016] Branch Assignment