微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何实现键-键或值-值类型的数据结构

如何解决如何实现键-键或值-值类型的数据结构

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

G1 = {a,b}

G2 = {c,d}

编写函数 f where

的最简单方法是什么?
  1. f(a) 返回 b
  2. f(b) 返回 a

我特别想避免使用以下类型的字典

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

因为

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

最好是 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 将查找给定节点的邻居(包的一个方法);您从该列表中随机选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。