我有一些名字:["James", "John", "Krieg"]和一些颜色:["Red", "Green", "Blue", "Yellow"]。我想使用一些散列函数将名称映射到颜色:f(name) -> color。这种联系是幂等的。例如,如果在原始列表f(James) -> Red中,那么在我将名称或颜色添加到它们各自的列表中之后,f(James)仍然是Red。
示例:
列表状态1:
["James", "John", "Krieg"] and ["Red", "Green", "Blue", "Yellow"]:
f(James) -> Red
f(John) -> Yellow
f(Krieg) -> Yellow列表状态2:
["James", "John", "Krieg", "Sarah"] and ["Red", "Green", "Blue", "Yellow", "Black"]:
(added "Sarah" and "Black")
f(James) -> Red
f(John) -> Yellow
f(Krieg) -> Yellow
f(Sarah) -> Green散列函数的细节并不重要,只要它尝试一致性即可。我之所以有这个问题,是因为我有一个显示给用户的姓名列表,并且随着该列表的增长,我希望以前输入的姓名的颜色关联是相同的(以便用户保留姓名/颜色关联)。我意识到,如果我提前指定了颜色列表,这将不是问题。
所以现在只是出于好奇--有没有哈希函数不会随着输入/输出大小的增长而改变先前关联的值,而不是持久性?对于之前的混乱,我很抱歉。
发布于 2011-06-03 06:08:47
我要说的是,如果不依靠持久力,这样的事情是不存在的。
我们可以排除任何基于列表位置的映射。让我们从N个名字和1个颜色开始-这意味着所有的名字都映射到一种颜色。如果我们以后有N个名字和M个颜色,除非我们能存储哪N个名字映射到第一个颜色,否则就没有办法做到这一点。
同样,我们可以根据名称/颜色的值排除任何内容。假设我们有一些函数f( name,color),它提供了决定名字最佳颜色的分数。如果F(鲍勃,绿色)>F(鲍勃,红色),那么当我们的列表从[bob], [red]到[bob], [green, red]时,我们将得到一个不同的映射。
您可以为此提出一些退化的解决方案,这些解决方案不会显式地“保存每个关联”,但仍然保留足够的状态来重新创建计算。在最好的情况下,它们存储的数据与简单地存储映射的数据一样多。在最坏的情况下,他们会储存更多的东西。
幂等性的使用表明你最初的问题可能是抽象的好奇心。如果有一个特殊的,实际的,你试图解决的问题,对这个问题进行更具体的解释会有所帮助。
发布于 2011-06-03 04:45:14
您说得对,您只需要将关联存储在内存中。您需要的是这样一个可变的关联集。在python中,这是一个字典:
>>> assocs = dict(zip(['James', 'John', 'Krieg', 'Sarah'], ['Red', 'Green', 'Blue', 'Yellow']))
>>> assocs['Sarah']
'Yellow'
>>> assocs['Sarah'] = 'Black'
>>> assocs['Sarah']
'Black'编辑
如果您总是拥有这两个列表,并且它们总是按顺序排列,那么为什么不使用列表索引来“存储”映射:
>>> names = ['James', 'John', 'Krieg', 'Sarah']
>>> colors = ['Red', 'Green', 'Blue', 'Yellow']
>>> def finmap(name):
... i = names.index(name)
... if i < len(colors):
... return colors[i]
... else:
... print 'all the colors have been assigned'
...希望这能有所帮助
发布于 2011-06-03 05:06:10
我不完全确定你所说的“一种即时的方式”是什么意思,但我认为一本幂等字典可能会有所帮助。例如:
##!/usr/bin/env python
# coding: utf-8
class idempotent_dict(dict):
def __setitem__(self, key, value):
if key in self:
return
super(idempotent_dict, self).__setitem__(key, value)
if __name__ == '__main__':
d = idempotent_dict()
d['James'] = 'Red'
d['John'] = 'Yellow'
d['Krieg'] = 'Yellow'
print d
d['James'] = 'Black'
d['John'] = 'Red'
d['Sarah'] = 'Green'
print d这将打印:
{'James': 'Red', 'John': 'Yellow', 'Krieg': 'Yellow'}
{'Sarah': 'Green', 'James': 'Red', 'John': 'Yellow', 'Krieg': 'Yellow'}`https://stackoverflow.com/questions/6220144
复制相似问题