哪些算法可用于尺寸效率A dictionary or associative array? 例如,使用此键/值集,如何避免在值中复制“Alice”?
{
"Pride and Prejudice": "Alice",
"The Brothers Karamazov": "Pat",
"Wuthering Heights": "Alice"
}
我检查了Python's implementation on dictionary,但似乎实现的重点是速度(保持O(1))不是大小。
答案 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)
尝试在哈希表中插入每个键值。 如果在插入之前存在密钥alredy,那么您发现了重复。 许多语言中有hashtable的实施次数。
基本上有两种方式:阵列和放大器树。
Array专注于高内存成本的速度。 Hashtable实现之间的主要区别在于unicity上的行为,某些实现强制执行unicity其他一些没有。
树以O(log(n))cpu使用成本为重点关注内存智能使用。 g ++ map依赖于非常强大的red black tree。
如果大小问题非常严重,那么您应该搜索Huffman压缩和/或Lampel Ziv压缩,但需要花费更多费用才能适应字典。
你应该看看数据库。 数据库的红黑树被称为BTree(差不多)。它为低延迟硬盘驱动器案例提供了分支因子优化。
我已将很多链接放到维基百科上,但如果您喜欢这个主题,我建议您: