问题描述
我正在寻找一种对字母进行分组的方法,这样一个组中的一个字母在被调用时可能会调用并返回同一组中的另一个字符。与字典数据结构非常相似,只是这对组合中的所有值都同时充当键和值。
G1 = {a,b}
G2 = {c,d}
编写函数 f
where
-
f(a)
返回b
-
f(b)
返回a
我特别想避免使用以下类型的字典
{"a":"b","b":"a","c","d","d":"c"}
因为
- 大规模冗余
- 还有
a
和b
可以是多字母字符串,可以这么大
最好是 Python,或者出于这个原因,欢迎使用独立于编程语言的解决方案。也许我不知道任何现有的数据结构实现。
解决方法
这里的交易取决于您是想腾出时间还是空间。
如果你想要速度,那么没有比你想要避免的冗余字典更好的解决方案了(据我所知)。使用该解决方案,您的空间复杂度为 O(2n),时间复杂度为 O(logn)。
但如果您不想拥有冗余数据并且不介意线性搜索,您可以使用带有修改查找功能的常规字典。类似这样的东西,在 Python 中。
def lookup(d,x):
y = d.get(x,None)
if y is None:
for k in d:
if d[k] == x:
y = k
break
return y
data = {
'a': 'b','c': 'd'
}
print(lookup(data,'a')) # output: b
print(lookup(data,'d')) # output: c
使用这种方法,空间复杂度为 O(n),一半的搜索时间复杂度为 O(logn),另一半的时间复杂度为 O(n)。
,从你的描述来看,你似乎想要这个功能:
def friend(head):
# Find the cluster that contains "head"
# Return another element of that cluster
如果集群是分区,那么该集群的所有元素都相互连接,并且没有其他元素,那么集合就可以很好地完成这项工作。例如:
import random
G1 = {a,b}
G2 = {c,d}
group_list = [G1,G2]
def friend(head):
for group in group_list:
if head in group:
headless = group - head
return random.choice(headless)
# If not found,return None by default
仅限配对使用的更新
如果你知道每个集合只有两个元素,那么循环体就简化为
if head in group:
return group - {head}
为了方便处理,你可以构建一个字典来从每个元素中查找集合。
lookup = {k: v for k in v for v in group_list}
然后您将找到没有 for
循环的正确组。
如果您有“外部”链接,那么您就有了一个图表。选择一个图形包(例如 networkx
)。 friend
将查找给定节点的邻居(包的一个方法);您从该列表中随机选择。