众所周知,某些Python的数据结构使用 哈希表
存储诸如set
或的项目dictionary
。因此,这些对象没有顺序。但似乎,对于某些数字序列,这是不正确的。
例如,请考虑以下示例:
>>> set([7,2,5,3,6])
set([2, 3, 5, 6, 7])
>>> set([4,5,3,0,1,2])
set([0, 1, 2, 3, 4, 5])
但是,如果我们进行一些小的更改,则无法排序:
>>> set([8,2,5,3,6])
set([8, 2, 3, 5, 6])
所以问题是:Python的哈希函数如何在整数序列上工作?
尽管SO的问题hash
及其顺序有很多问题,但没有人解释哈希函数的算法。
因此,这里您所需要的就是知道python如何计算哈希表中的索引。
如果您浏览hashtable.c
CPython源代码中的文件,则会在_Py_hashtable_set
函数中看到以下几行内容,这些内容显示了python计算哈希表键索引的方式:
key_hash = ht->hash_func(key);
index = key_hash & (ht->num_buckets - 1);
因此,由于整数的哈希值是整数本身*(-1除外),因此索引基于数字和数据结构的长度(ht->num_buckets - 1
),并且使用位与-
和之间(ht->num_buckets - 1)
以及该数字进行计算。
现在考虑以下set
使用hash-table的示例:
>>> set([0,1919,2000,3,45,33,333,5])
set([0, 33, 3, 5, 45, 333, 2000, 1919])
对于数量,33
我们有:
33 & (ht->num_buckets - 1) = 1
实际上是:
'0b100001' & '0b111'= '0b1' # 1 the index of 33
注意 在这种情况下(ht->num_buckets - 1)
是8-1=7
或0b111
。
对于1919
:
'0b11101111111' & '0b111' = '0b111' # 7 the index of 1919
对于333
:
'0b101001101' & '0b111' = '0b101' # 5 the index of 333
以及上述示例:
>>> set([8,2,5,3,6])
set([8, 2, 3, 5, 6])
'0b1000' & '0b100'='0b0' # for 8
'0b110' & '0b100'='0b100' # for 8
*类的哈希函数int
:
class int:
def __hash__(self):
value = self
if value == -1:
value = -2
return value
我正试图从现实中解决一个问题 “偶数总和” 但是我不能这样做。下面是问题。 即使是总和也是两个玩家的游戏。玩家将获得N个正整数序列并轮流进行。在每个回合中,玩家选择一个非空切片(连续元素的子序列),使得该切片中的值之和是偶数,然后删除切片并连接序列的其余部分。第一个无法做出合法举动的玩家将输掉比赛。 如果你和你的对手玩这场游戏,你想知道你是否能赢,假设你和对手都玩得很好。你先走。 写一个函数:
2(名)-约翰 3(型号)-客车 4(attr_hash)-由java哈希代码计算
问题内容: 我碰到了Java行,并对它的输出感到困惑。您能否解释一下此代码背后的逻辑 输出: 问题答案: 好吧,它等效于: 真正地将原始内容显式转换为只是使其调用而不是。 我相信to 转换 实际上首先 要进行隐式加宽转换-就像这样: 这些帮助有用?
我正在我想要存储字符串的哈希程序中使用DJB2哈希函数。但是这个哈希函数返回一个非常大的无符号int值作为返回值(哈希表索引)。如果我的表大小很小(比如说13),有没有办法把这个大值转换成更小的。我只想尽可能避免碰撞。 DJB2哈希函数代码如下:
C++中的“using”关键字背后的逻辑是什么? 它在不同的情况下使用,我试图找到是否所有这些都有共同点,有一个原因为什么“using”关键字被这样使用。
问题内容: 我无法理解和与axis参数一起使用时的输出。例如: 如您所见,最大值是点(1,1),最小值是点(0,0)。因此,按照我的逻辑,当我运行时: 我期望 我期望 我期望 我期望 我对事物的理解有什么问题? 问题答案: 通过添加参数,NumPy分别查看行和列。如果未指定,则将数组展平为单个一维数组。 表示该操作依次在2D数组的列中 向下 执行。 例如,返回四列中每一列的最小值的索引。每列中的最