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 的桶数选择质数的原因
设有一个哈希函数

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源码,可以参考
#include <stdio.h>

#define M 100
#define Hash_key = 29 template <class T>
struct HashNode
{
T data;
int key;
int isNull;
HashNode<T>* pNext; HashNode(){
pNext = NULL;
isNull = ;
}
}; 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 == ) {
m_HashNodes[address].data = data;
m_HashNodes[address].isNull == ;
}
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 = NULL
while (pTmpNode != NULL) {
pCurNode = pTmpNode;
pTmpNode = pTmpNode->pNext;
}
pCurNode->pNext = new HashNode<T>();
pCurNode->pNext->data = data;
pCurNode->pNext->key = key;
pCurNode->pNext->isNull = ;
}
} 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
}
} }

HashTable 简述的更多相关文章

  1. C# Hashtable 简述

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

  2. 哈希表(Hashtable)简述

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

  3. C#中HashTable的用法

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

  4. [转]net中哈希表的使用 Hashtable

    本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...

  5. C#中HashTable的用法示例1

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

  6. 类 Array Arraylist List Hashtable Dictionary

    总结C# 集合类 Array Arraylist List Hashtable Dictionary Stack Queue  我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashT ...

  7. 黑马程序员-hashtable

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

  8. C#中hashtable的赋值、取值、遍历、排序操作

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

  9. C# Hashtable 使用说明 以及 Hashtable和HashMap的区别

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

随机推荐

  1. Integration Services创建ETL包

    http://www.cnblogs.com/chiniao/archive/2009/12/23/1630595.html  (转载) Microsoft Integration Services ...

  2. Spring Boot快速开发Web项目

    我们以前使用Spring框架的时候,需要首先在pom文件中增加对相关的的依赖,然后新建Spring相关的xml文件,而且往往那些xml文件还不会少.然后继续使用tomcat或者jetty作为容器来运行 ...

  3. 莫名其妙MyEclipse

    MyEclipse Enterprise Workbench Version: 2015 Stable 2.0Build id: 13.0.0-20150518 整合SS时,\WEB-INF\clas ...

  4. 查找SQL SERVER被锁的表和解决方法

    查找数据库中被锁表代码: select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName ...

  5. wcf 推送 与 广播

    原文地址:http://blog.csdn.net/is_zhoufeng/article/details/7641234 ////wcf 接口   #region << 版 本 注 释 ...

  6. Jsoup使用随记

    这段时间工作比较空闲,在网上找资料学习的时候看到数据抓取这一块,来了兴趣 用jsoup实现数据抓取着实方便,唯一美中不足的是官方API是英文版的,对我这样英语水平不好的程序员来说着实困扰,只能一点点的 ...

  7. MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。

    CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...

  8. Leetcode4:Median of Two Sorted Arrays@Python

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  9. ue4 c++ 接口

    使用UE4接口比起普通的高级语言,要多做很多工作,是因为要兼容蓝图的使用,有一些小坑需要注意,开始吧. 1.新建接口类 打开UE4编辑器,与往常一样,新建C++类,然后选择Object继承,然后取名字 ...

  10. php工作笔记7-摇动手机,发出请求响应

    1.调用