【发布时间】:2017-12-05 20:10:06
【问题描述】:
一个 Python 列表
f = [x0, x1, x2]
可以看作是从[0, 1, ..., len(f) - 1] 到其元素集的映射的有效表示。 “高效”是指 f[i] 在 O(1) 时间内返回与 i 关联的元素。
逆映射可以定义如下:
class Inverse:
def __init__(self, f):
self.f = f
def __getitem__(self, x):
return self.f.index(x)
这可行,但是Inverse(f)[x] takes O(n) time on average。
或者,可以使用dict:
f_inv = {x: i for i, x in enumerate(f)}
这具有 O(1) 的平均时间复杂度,但它要求列表中的对象为 hashable。
有没有一种方法可以定义一个逆映射,该映射提供基于等式的查找,平均时间为 O(1),unhashable 对象?
编辑:示例输入和预期输出:
>>> f = [x0, x1, x2]
>>> f_inv = Inverse(f) # this is to be defined
>>> f_inv[x0] # in O(1) time
0
>>> f_inv[x2] # in O(1) time
2
【问题讨论】:
-
让它们可散列?它们是什么价值观?
-
使可变对象可哈希化似乎是一种非常有效的自爆方式:asmeurer.com/blog/posts/…
-
取决于你的数据是什么以及你想用它做什么。也许它无缘无故地可变/不可散列。
-
这是一个通用图(在数学意义上)库。这些值是节点标签,它们实际上可以是任何东西。
-
您想通过对象标识 (
is) 还是通过相等 (==) 执行此查找?
标签: python list dictionary hashable