问题描述
在Python中,dict
和set
是基于哈希的,因此需要可哈希的密钥类型。
在C++中,还有基于哈希的std::unordered_map和std::unordered_set。
但是C ++具有这些结构的变体,不需要键可散列-std::map和std::set。键可能只支持少一个比较操作<
(也许还需要相等==
)就足够了。同样,这些结构按排序顺序枚举其键,这是一个很好的属性,与无序变体不同。
这些std::map
/ std::set
在O(log N)
摊销时间内查找/插入密钥,这与散列结构在O(1)
时间内进行查找不同。
尽管对于足够大的数据,基于散列的变体更快,但它们需要键成为可散列的类型,但是在python list
/ dict
中,嵌套结构不可散列,因此无法进行dict / set没有额外转换的键,例如我们可以使用str_key = json.dumps({"x": 1,"y": [2,3]},sort_keys = True)
将列表/字典键转换为字符串,或者使用bytes_key = pickle.dumps({"x": 1,3]})
转换为字节(但可能只有在经过测试的情况下,腌制变体才会产生相同的字节,未经测试)。
Python中是否有针对非基于哈希的pip
/ dict
变体的标准或流行的非标准(即通过set
模块)支持?像C++
的{{1}} / std::map
实现一样?
也许这些非基于哈希的变量很难通过保留(键,值)对的排序列表(按键排序)来建模,但是为此是否有现成的代码?也可以通过std::set
查找关键位置来使用未排序的列表,但是它的查找/插入时间为lst.index(key)
,对于大量数据来说,这非常慢。
例如,有趣的是,决定对主要dict操作基于排序列表(加上O(N)
模块)对dict解决方案进行编码,它对于搜索/获取操作非常有效(bisect
),但是非常插入操作效率不高(O(log N)
)(因为它需要将整个数组数据在插入点处向右移一位):
O(N)
相关问题:
- 由@parktomatomi建议有关implementations of binary tree
- @PascalGetreuer建议implementing of hash method
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)