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

时间:2013-07-09 16:28:16

标签: python algorithm dictionary

哪些算法可用于尺寸效率A dictionary or associative array? 例如,使用此键/值集,如何避免在值中复制“Alice”?

{
    "Pride and Prejudice": "Alice",
    "The Brothers Karamazov": "Pat",
    "Wuthering Heights": "Alice"
}

我检查了Python's implementation on dictionary,但似乎实现的重点是速度(保持O(1))不是大小。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

正如bennofs在评论中所提到的,您可以使用intern()来确保相同的字符串只存储一次:

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

答案 2 :(得分:0)

  • 如果您的字典可以放入内存中,则可以使用简单的Hashtable。

尝试在哈希表中插入每个键值。 如果在插入之前存在密钥alredy,那么您发现了重复。 许多语言中有hashtable的实施次数。

基本上有两种方式:阵列和放大器树。

  • Array专注于高内存成本的速度。 Hashtable实现之间的主要区别在于unicity上的行为,某些实现强制执行unicity其他一些没有。

  • 树以O(log(n))cpu使用成本为重点关注内存智能使用。 g ++ map依赖于非常强大的red black tree

如果大小问题非常严重,那么您应该搜索Huffman压缩和/或Lampel Ziv压缩,但需要花费更多费用才能适应字典。

  • 如果您的词典无法适应记忆

你应该看看数据库。 数据库的红黑树被称为BTree(差不多)。它为低延迟硬盘驱动器案例提供了分支因子优化。

我已将很多链接放到维基百科上,但如果您喜欢这个主题,我建议您:

Introduction to algorithms