python dict hash算法_在python字典中处理哈希冲突

通常,您将使用用户记录中最独特的元素。这通常意味着系统通常对每个记录(用户)都有一个用户名或唯一的ID,这保证是唯一的。用户名或ID将是记录的唯一密钥。由于这是由系统本身强制执行的,例如通过数据库表中的自动递增键,所以可以确保没有冲突。在

因此,该唯一键应该是映射中的键,以允许您查找用户记录。在

但是,如果由于某种原因您无法访问这样一个保证为唯一的密钥,那么您当然可以从记录中创建一个哈希(如您所述),并使用许多哈希表算法中的任何一个来存储具有可能发生冲突的键的元素。在这种情况下,你不能避免碰撞,但你只是简单地处理它。在

一个快速而常用的算法是这样的:像您已经做的那样,在记录上使用散列来创建一个密钥。此密钥可能不是唯一的。现在在键指示的位置存储记录列表。我们称这些清单为“桶”。要存储新元素,请对其进行哈希处理,然后将其附加到存储在该位置的列表中(将其添加到bucket中)。要找到一个元素,将其散列,找到条目,然后在该位置按顺序搜索列表/存储桶以找到所需的条目。在

下面是一个例子:mymap[123] = [ {'name':'John','age':27}, {'name':'Bob','age':19} ]

mymap[678] = [ {'name':'Frank','age':29} ]

在这个例子中,您有一个哈希表(通过dict实现)。您有哈希键值678,其中一个条目存储在bucket中。然后您得到了哈希键值123,但是有一个冲突:'John'和'Bob'条目都有这个散列值。不管怎样,找到存储在mymap[123]中的bucket并对其进行迭代以找到值。在

这是一个非常灵活且非常常见的哈希映射实现,它不需要重新分配或其他复杂情况。它在很多地方都有描述,例如:https://www.cs.auckland.ac.nz/~jmor159/PLDS210/hash_tables.html(在第8.3.1章中)。在

性能通常只会在发生大量冲突时才成为问题(当每个bucket的列表变得非常长时)。你可以用一个好的哈希函数来避免。在

但是:记录的一个真正的唯一ID(例如由数据库强制执行)可能仍然是首选方法。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值