首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >幂等散列关联

幂等散列关联
EN

Stack Overflow用户
提问于 2011-06-03 04:40:23
回答 6查看 608关注 0票数 1

我有一些名字:["James", "John", "Krieg"]和一些颜色:["Red", "Green", "Blue", "Yellow"]。我想使用一些散列函数将名称映射到颜色:f(name) -> color。这种联系是幂等的。例如,如果在原始列表f(James) -> Red中,那么在我将名称或颜色添加到它们各自的列表中之后,f(James)仍然是Red

示例:

列表状态1:

代码语言:javascript
复制
["James", "John", "Krieg"] and ["Red", "Green", "Blue", "Yellow"]: 
    f(James) -> Red
    f(John) -> Yellow 
    f(Krieg) -> Yellow

列表状态2:

代码语言:javascript
复制
["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

散列函数的细节并不重要,只要它尝试一致性即可。我之所以有这个问题,是因为我有一个显示给用户的姓名列表,并且随着该列表的增长,我希望以前输入的姓名的颜色关联是相同的(以便用户保留姓名/颜色关联)。我意识到,如果我提前指定了颜色列表,这将不是问题。

所以现在只是出于好奇--有没有哈希函数不会随着输入/输出大小的增长而改变先前关联的值,而不是持久性?对于之前的混乱,我很抱歉。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-03 06:08:47

我要说的是,如果不依靠持久力,这样的事情是不存在的。

我们可以排除任何基于列表位置的映射。让我们从N个名字和1个颜色开始-这意味着所有的名字都映射到一种颜色。如果我们以后有N个名字和M个颜色,除非我们能存储哪N个名字映射到第一个颜色,否则就没有办法做到这一点。

同样,我们可以根据名称/颜色的值排除任何内容。假设我们有一些函数f( name,color),它提供了决定名字最佳颜色的分数。如果F(鲍勃,绿色)>F(鲍勃,红色),那么当我们的列表从[bob], [red][bob], [green, red]时,我们将得到一个不同的映射。

您可以为此提出一些退化的解决方案,这些解决方案不会显式地“保存每个关联”,但仍然保留足够的状态来重新创建计算。在最好的情况下,它们存储的数据与简单地存储映射的数据一样多。在最坏的情况下,他们会储存更多的东西。

幂等性的使用表明你最初的问题可能是抽象的好奇心。如果有一个特殊的,实际的,你试图解决的问题,对这个问题进行更具体的解释会有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2011-06-03 04:45:14

您说得对,您只需要将关联存储在内存中。您需要的是这样一个可变的关联集。在python中,这是一个字典:

代码语言:javascript
复制
>>> assocs = dict(zip(['James', 'John', 'Krieg', 'Sarah'], ['Red', 'Green', 'Blue', 'Yellow']))
>>> assocs['Sarah']
'Yellow'
>>> assocs['Sarah'] = 'Black'
>>> assocs['Sarah']
'Black'

编辑

如果您总是拥有这两个列表,并且它们总是按顺序排列,那么为什么不使用列表索引来“存储”映射:

代码语言:javascript
复制
>>> 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'
...

希望这能有所帮助

票数 2
EN

Stack Overflow用户

发布于 2011-06-03 05:06:10

我不完全确定你所说的“一种即时的方式”是什么意思,但我认为一本幂等字典可能会有所帮助。例如:

代码语言:javascript
复制
##!/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

这将打印:

代码语言:javascript
复制
{'James': 'Red', 'John': 'Yellow', 'Krieg': 'Yellow'}
{'Sarah': 'Green', 'James': 'Red', 'John': 'Yellow', 'Krieg': 'Yellow'}`
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6220144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档