使用python作为参考来理解哈希表

时间:2017-05-07 00:46:47

标签: python algorithm hash hashtable hash-collision

我正在hash table上进行在线讲座,我想确认一下我对hash table的理解。

我了解hashing将使用m函数将所有可能密钥的范围缩小到集chaining并使用collisions来解析m }}

我似乎无法想象它的dict()部分。假设我在python中创建了一个空的python var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v1=\"http://openclinica.org/ws/studySubject/v1\" xmlns:bean=\"http://openclinica.org/ws/beans\">" +"<soapenv:Header>" +"<wsse:Security soapenv:mustUnderstand=\"1\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">" +"<wsse:UsernameToken wsu:Id=\"UsernameToken-27777511\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">" +"<wsse:Username>x</wsse:Username>" +"<wsse:Password>y</wsse:Password>" +"</wsse:UsernameToken>" +"</wsse:Security>" +"</soapenv:Header>" +"<soapenv:Body>" +"<v1:importRequest>" +"<ODM>" +"<ClinicalData StudyOID=\"S_PROSPER2\" MetaDataVersionOID=\"v1.0.0\">" +"<SubjectData SubjectKey=\"SS_UU001\">" +"<StudyEventData StudyEventOID=\"SE_QUESW4\" StudyEventRepeatKey=\"0\">" +"<FormData FormOID=\"F_RANDANDQUEST_11\">" +"<ItemGroupData ItemGroupOID=\"IG_RANDA_UNGROUPED\" ItemGroupRepeatKey=\"1\" TransactionType=\"Insert\">" +"<ItemData ItemOID=\"I_RANDA_RAND01\" Value=\"1\"/>" +"<ItemData ItemOID=\"I_RANDA_RAND02\" Value=\"1\"/>" +"<ItemData ItemOID=\"I_RANDA_RAND03\" Value=\"1\"/>" +"<ItemData ItemOID=\"I_RANDA_RAND04\" Value=\"1\"/>" +"</ItemGroupData>" +"</FormData>" +"</StudyEventData>" +"</SubjectData>" +"</ClinicalData>" +"</ODM>" +"</v1:importRequest>" +"</soapenv:Body>" +"</soapenv:Envelope>"; var options = { "method" : "post", "contentType" : "text/xml; charset=utf-8", "payload" : xml }; var result = UrlFetchApp.fetch("http://89.221.253.174:8080/OpenClinica-ws/ws/data/v1/dataWsdl.wsdl", options); Logger.log(result); 是否会创建一个包含预定义空闲插槽数的表?

1 个答案:

答案 0 :(得分:2)

概述

可以在2017年的Pycon演讲Modern Python Dictionaries A confluence of a dozen great ideas中找到有关如何实现Python字典的概述。

如何可视化减少

  

据我所知,哈希表将使用散列函数将所有可能密钥的范围缩小到集合m,并使用链接来解决冲突。 ......我似乎无法想象它的m部分。

最简单的可视化是m == 2,因此散列将键分为两组:

>>> from pprint import pprint
>>> def hash(n):
        'Hash a number into evens or odds'
        return n % 2

>>> table = [[], []]
>>> for x in [10, 15, 12, 41, 80, 13, 40, 9]:
        table[hash(x)].append(x)

>>> pprint(table, width=25)
[[10, 12, 80, 40],
 [15, 41, 13, 9]]

在上面的例子中,八个键全部分为两组(平均值和赔率)。

该示例也适用于较大的 m 值,例如m == 7

>>> table = [[], [], [], [], [], [], []]
>>> for x in [10, 15, 12, 41, 80, 13, 40, 9]:
        table[x % 7].append(x)

>>> pprint(table, width=25)
[[],
 [15],
 [9],
 [10, 80],
 [],
 [12, 40],
 [41, 13]]

如您所见,上面的示例有两个空插槽和一个碰撞插槽。

空字典表

  

假设我在python中创建一个空的dict()。 python是否创建了一个包含一些预定数量的空条目的表?

是的,Python为空表创建了八个插槽。在Python的源代码中,我们在cpython/Objects/dictobject.c中看到#define PyDict_MINSIZE 8