Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大小有效的字典(关联数组)实现_Python_Algorithm_Dictionary - Fatal编程技术网

Python 大小有效的字典(关联数组)实现

Python 大小有效的字典(关联数组)实现,python,algorithm,dictionary,Python,Algorithm,Dictionary,有哪些算法可以实现尺寸效率? 例如,使用此键/值集,如何避免值中的重复“Alice” { "Pride and Prejudice": "Alice", "The Brothers Karamazov": "Pat", "Wuthering Heights": "Alice" } 我检查过了,但似乎实现的重点是速度(保持O(1))而不是大小 如果你的字典可以放在内存中,那么就可以使用一个简单的哈希表。 尝试在哈希表中插入每个键值。 如果插入前密钥已存在,则您已找到重

有哪些算法可以实现尺寸效率? 例如,使用此键/值集,如何避免值中的重复“Alice”

{
    "Pride and Prejudice": "Alice",
    "The Brothers Karamazov": "Pat",
    "Wuthering Heights": "Alice"
}
我检查过了,但似乎实现的重点是速度(保持O(1))而不是大小

  • 如果你的字典可以放在内存中,那么就可以使用一个简单的哈希表。
尝试在哈希表中插入每个键值。 如果插入前密钥已存在,则您已找到重复项。 在许多语言中都有大量的实现

基本上有两种方法:数组和树

  • 以高内存成本关注速度。哈希表实现之间的主要区别在于行为的唯一性,有些实现强制唯一性,有些实现则不强制唯一性

  • 树以O(log(n))cpu使用为代价,关注内存智能使用。g++映射依赖于非常满的电源

如果大小是非常非常有问题的,那么您应该搜索压缩和/或压缩,但它的成本稍高,以适应词汇

  • 如果你的措辞无法记忆
您应该查看数据库。 数据库的红黑树称为(几乎)。它针对低延迟硬盘驱动器案例进行了分支因子优化

我在维基百科上放了很多链接,但如果你喜欢这个主题,我建议你:


提高空间效率的一种方法(除了共享值之外,正如bennofs在评论中指出的那样,您可以通过使用sys.intern有效地实现共享值),就是使用,这是一种开放寻址方案(线性探测的一种变体)为了解决冲突,封闭式寻址方案会占用更多空间,因为您需要为每个bucket分配一个链表,而对于开放式寻址方案,您只需在备份阵列中使用一个相邻的开放插槽,而无需分配任何链表。与其他开放寻址方案(如布谷鸟散列或香草线性探测)不同,跳点散列在高负载因子(超过90%)下表现良好,并保证恒定的查找时间。

如注释中所述,您可以使用以确保相同的字符串只存储一次:

class InternDict(dict):

    def __setitem__(self, key, value):
        if isinstance(value, str):
            super(InternDict, self).__setitem__(key, intern(value))
        else:
            super(InternDict, self).__setitem__(key, value)
下面是一个具有以下效果的示例:

>>> d = {}
>>> d["a"] = "This string is presumably too long to be auto-interned."
>>> d["b"] = "This string is presumably too long to be auto-interned."
>>> d["a"] is d["b"]
False
>>> di = InternDict()
>>> di["a"] = "This string is presumably too long to be auto-interned."
>>> di["b"] = "This string is presumably too long to be auto-interned."
>>> di["a"] is di["b"]
True

保留第二个字典,将值id(例如哈希)映射到值,在这个字典中使用值id。您的数据结构是否支持可变值?如果您只希望字符串作为值,我认为您可以存储sys.intern的结果。@Pavel:这不会很简单,因为可能会有哈希值id冲突。交换键和值?