散列表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. [安全]服务器安全之 PHP权限目录

    1.为每个主机配置增加一个 fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/";  或是直接把这句话放到fa ...

  2. 深入理解php内核 编写扩展 I:介绍PHP和Zend

    内容: 编写扩展I -  PHP和Zend起步 原文:http://devzone.zend.com/public/view/tag/Extension Part I: Introduction to ...

  3. C# DateDateTimePicker设置属性ShowCheckBox为True

    DateDateTimePicker的属性ShowCheckBox为True后,可以使用时间控件的复选框. 但是如果,你想设置CheckBox的选中状态为False的话,那么请注意赋时间值和赋状态值的 ...

  4. js比较日期大小

    第一种方法: var starttime = "2007-1-2 7:30"; var endtime = "2007-2-31 8:30"; alert(Co ...

  5. Windows下docker的安装,将ASP.NET Core程序部署在docker中

    参考文章: https://www.cnblogs.com/jRoger/p/aspnet-core-deploy-to-docker.html https://www.cnblogs.com/jRo ...

  6. linux kvm虚拟机使用

    安装配置kvm 1.安装kvm软件包 [root@kvm ~]# yum install kvm python-virtinst libvirt tunctl bridge-utils virt-ma ...

  7. ZED-Board从入门到精通系列(八)——Vivado HLS实现FIR滤波器

    http://www.tuicool.com/articles/eQ7nEn 最终到了HLS部分.HLS是High Level Synthesis的缩写,是一种能够将高级程序设计语言C,C++.Sys ...

  8. 关于Oracle处理DDL和DML语句的事务管理

    SQL主要程序设计语言 数据定义语言DDL(Data Definition Language) 如 create.alter.drop, 数据操作语言DML(Data Munipulation Lan ...

  9. 关于python2.7从数据库读取中文显示乱码的问题解决

    #!/usr/bin/env python # _*_ coding:utf-8 _*_ import MySQLdb import sys str = raw_input("please ...

  10. 翻译:Identifier Name标识符命名规则

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...