散列表Hash table,也叫哈希表),是根据(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,

将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表

  一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表,在首字母为W的表中查找“王”姓的电话号码,

显然比直接查找就要快得多。这里使用人名作为关键字,“取首字母”是这个例子中散列函数的函数法则,存放首字母的表对应散列表。关键字和函数法

则理论上可以任意确定。

 它仅支持插入,查找和删除三类字典操作,在散列表中查找一个元素的时间在最坏的情况下是O(n),这和链表的操作时间一致。在实际中,散列

的效率是非常高的,最高的查找期望时间为O(1)

  在关键字的全域U比较小时,直接寻址是一种简单有效的方法。具体思路是取关键字或关键字的某个线性函数值为散列地址。即{hash(k)=k}或

{hash(k)=a*k+b},其中{a,b}为常数(这种散列函数叫做自身函数)

  python语言是非常简洁的,我把python源码和算法导论的伪码对比发现,这伪码到python源码几乎可以算是一一对应,所以,我这里就贴出了

python源码,即直观又简洁:

KEYS = (12,6554,12345,34234,234234,6456456,34234,67645,2343432,23423,1343324)
DELETED = -1
m=len(KEYS)
T=[None for _ in range(m)] def h1(k):
return k % m def HASH_INSERT(T,k):
j=h1(k)
if T[j]==None or T[j]==DELETED:
T[j]=k
return j def HASH_SEARCH(T,k):
j=h1(k)
if T[j] == k:
return j if T[j]==None:
return None def HASH_DELETE(T,k):
i=HASH_SEARCH(T,k)
if i is None:
raise Exception("key %s doesn't exist"%k)
T[i]=DELETED if __name__=='__main__':
for k in KEYS:
HASH_INSERT(T,k)
print "all keys:"
print(T) print "every key:"
for k in KEYS:
print(k,HASH_SEARCH(T,k)) print "del key1:"
HASH_DELETE(T,KEYS[1])
print(T) print "none keys:"
for k in KEYS:
if HASH_SEARCH(T,k) is None:
print(k) print "insert key1:"
HASH_INSERT(T,KEYS[1])
print(T)

  运行结果:

all keys:
[234234, 12, 34234, 12345, 23423, None, 6456456, None, None, 6554, None]
every key:
(12, 1)
(6554, 9)
(12345, 3)
(34234, 2)
(234234, 0)
(6456456, 6)
(34234, 2)
(67645, None)
(2343432, None)
(23423, 4)
(1343324, None)
del key1:
[234234, 12, 34234, 12345, 23423, None, 6456456, None, None, -1, None]
none keys:
6554
67645
2343432
1343324
insert key1:
[234234, 12, 34234, 12345, 23423, None, 6456456, None, None, 6554, None]

  

python实现散列表的直接寻址法的更多相关文章

  1. python实现散列表的链表法

    在散列中,链接法是一种最简单的碰撞解决技术,这种方法的原理就是把散列到同一槽中的所有元素 都放在一个链表中. 链接法有两个定理,定理一: 在简单一致散列的假设下,一次不成功查找的期望时间为O(1 + ...

  2. Python数据结构——散列表

    散列表的实现常常叫做散列(hashing).散列仅支持INSERT,SEARCH和DELETE操作,都是在常数平均时间执行的.需要元素间任何排序信息的操作将不会得到有效的支持. 散列表是普通数组概念的 ...

  3. Python:说说字典和散列表,散列冲突的解决原理

    散列表 Python 用散列表来实现 dict.散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组).在一般书中,散列表里的单元通常叫做表元(bucket).在 dict 的散列表当中,每个键 ...

  4. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  5. 《算法导论》— Chapter 11 散列表

    1 序 在很多应用中,都要用到一种动态集合结构,它仅支持INSERT.SEARCH以及DELETE三种字典操作.例如计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键字为任意字符串,与语言 ...

  6. Python与数据结构[4] -> 散列表[2] -> 开放定址法与再散列的 Python 实现

     开放定址散列法和再散列 目录 开放定址法 再散列 代码实现 1 开放定址散列法 前面利用分离链接法解决了散列表插入冲突的问题,而除了分离链接法外,还可以使用开放定址法来解决散列表的冲突问题. 开放定 ...

  7. Python与数据结构[4] -> 散列表[1] -> 分离链接法的 Python 实现

    分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...

  8. 【Python算法】哈希存储、哈希表、散列表原理

    哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中 ...

  9. Python与数据结构[4] -> 散列表[0] -> 散列表与散列函数的 Python 实现

    散列表 / Hash Table 散列表与散列函数 散列表是一种将关键字映射到特定数组位置的一种数据结构,而将关键字映射到0至TableSize-1过程的函数,即为散列函数. Hash Table: ...

随机推荐

  1. javascript设计模式——策略模式

    前面的话 在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方 ...

  2. 小随笔:利用Shader实现模型爆炸和沙粒化的效果

    0x00 前言 上一篇小随笔<小随笔:利用Shader给斯坦福兔子长毛和实现雪地效果>中,我和大家聊了聊著名的斯坦福兔子和利用geometry shader实现的一些效果.这篇文章继续沿用 ...

  3. OBS源码解析(3)OBSApp类介绍

    OBSApp类有以下功能: 1.负责配置文件管理 2.版本信息管理 3.主界面OBSBasic对象管理 4.obs模块初始化 class OBSApp : public QApplication { ...

  4. tensorflow MNIST新手教程

    官方教程代码如下: import gzip import os import tempfile import numpy from six.moves import urllib from six.m ...

  5. 巧用第三方高速开发Android App 热门第三方SDK及框架

    巧用第三方高速开发Android App 热门第三方SDK及框架 历经大半年的时间,最终是把这门课程给录制出来了,也就在今天,正式在慕课网上上线了 项目地址:巧用第三方高速开发Android App ...

  6. win7中用 httplistener 出现 503 错误的问题

    项目中须要用httplistener提供一个简单的httpserver服务.可是执行都是提示: UnHandledException Message:拒绝訪问 在System.Net.HttpList ...

  7. MacBook 经常使用快捷键

    Mac OS X系统图形表示方法 ⇧ = shift ⌃ = control ⌥ = option / alt  Home=fn + ◄  End=fn + ►  Page Up=fn + ▲ Pag ...

  8. 【quickhybrid】API规划

    前言 当一切就绪后,就要开始进行API规划,这一块是整个Hybrid框架中非常重要的内容,毕竟对于前端页面来说,只会通过JS API来调用功能. 基本上,API调用起来是否方便简洁影响着整个体验. 这 ...

  9. 如何导入外部的源码到eclipse中

    用struts,spring等框架开发也有两年的时间了,一直很少去阅读其源码,每次在eclipse编码的过程中想要看某一个类的源码,ctrl点击总是出现source not found的提示,也没有去 ...

  10. angular自定义分页组件(实用)

    功能描述:分页,点击按钮或者下一页获取分页接口,同时active到对应页码. html模块: <page page-count="totalPage" on-click-pa ...