繁体   English   中英

如何实现一个key-key或value-value类型的数据结构

[英]How to implement a key-key or value-value type data structure

我正在寻找一种对字母进行分组的方法,这样一个组中的一个字母在被调用时可能会调用并返回同一组中的另一个字符。 与字典数据结构非常相似,只是这对中的所有值都充当键和值。

G1 = {a,b}

G2 = {c,d}

编写 function f最简单的方法是什么

  1. f(a)返回b
  2. f(b)返回a

我特别想避免下面的类型字典

{"a":"b", "b":"a", "c","d", "d":"c"}

因为

  1. 大规模冗余
  2. ab也可以是多字母字符串,可以这么大

最好是 Python,或者因此欢迎编程语言独立的解决方案。 也许我不知道任何现有的数据结构实现。

这里的交易取决于您是否想节省时间或空间。

如果您想要速度,那么没有比您想要避免的冗余字典更好的解决方案(据我所知)。 使用该解决方案,空间复杂度为 O(2n),时间复杂度为 O(logn)。

但是,如果您不想拥有冗余数据并且不介意线性搜索,则可以使用带有修改查找 function 的常规字典。 像这样的东西,在 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循环的正确组。


如果您有“外部”链接,那么您就有了图表。 选择一个图形 package (例如networkx )。 friend将查找给定节点的邻居(包的一种方法); 您从该列表中随机选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM