【问题标题】:Canonical form for set of lists列表集的规范形式
【发布时间】:2019-04-13 15:38:09
【问题描述】:

给定两个无序集合,每个集合包含 n 个项目的 m 个列表。 m=4 和 n=3 的示例:

D1 = {[4,2,1], [3,3,1], [4,2,3], [1,2,1]}
D2 = {[3,2,3], [4,2,3], [1,1,3], [4,2,1]}

如果两个集合在各自列表中的元素之间存在一一对应关系,则认为这两个集合是等价的。在上面的例子中,D1 和 D2 是等价的,因为 D1 中有一个赋值 (1,2,3,4) ↔ D2 中的 (3,2,1,4)。

在这个例子中,项目是数字,但这并不重要,因为我只关心两组之间的等价关系,而不关心项目本身。

我正在寻找一种快速的方法来检查两个给定的集合是否相等。除了执行回溯搜索来查找项目之间的分配,是否可以将集合以唯一(规范)形式序列化,以便如果它们的规范形式相同,则可以证明两个集合是等价的?

更新:尽管这个问题通常看起来很难解决(见下面的答案),但事实证明,回溯搜索在实践中对我的数据很有效。下面是我的实现的伪代码:

s = new stack(of level)
x1_x2 = new dictionary(of int, int)
bound_x2s = new set(of int)

function setsEquivalent(d1: set, d2: set) : boolean
    if d1.m <> d2.m or d1.n <> d2.n: return false        
    s.push(new level)
    do until s.size = 0
        m1 = s.size
        m2 = s.top.m2
        if m1 > m
            return true
        elseif s.top.m2 > m
            backtrack()
        else                
            s.push(new level)
            for k = 1..n
                if not try_bind(d1.m(m1)(k), d2.m(m2)(k))
                    backtrack()
                    exit for
    return false

function try_bind(x1: int, x2: int) : boolean
    if x1_x2.containskey(x1)
        return x1_x2(x1) = x2
    elseif bound_x2s.contains(x2)
        return false
    else
        x1_x2.add(x1,x2)
        bound_x2s.add(x2)
        s.top.boundx1s.add(x1)
        return true

procedure backtrack()
    for each x1 in s.top.boundx1s:
        bound_x2s.remove(x1_x2(x1))
        x1_x2.remove(x1)
    s.pop
    if s.size <> 0
      s.top.m2 += 1

record level
    m2 = 1
    boundx1s = new list(of int)

【问题讨论】:

  • 欢迎来到 StackOverflow。请确保您的问题是明确的。这个问题很好,但缺少一些重要信息。告诉我们更多关于“对象”的信息。可以将它们序列化为规范形式,以便可以对它们施加(无意义的)命令吗?可以测试两个对象的相等性吗?另外,你的例子是什么意思?您是否给出了D1D2 的定义,并且“解决方案”是使D1 等于D2 的一组作业?如果是这样,那似乎与您的问题相反。如果没有,请重写你的例子。
  • 对象的性质并不重要,因为我只对表达集合所属的等价类感兴趣。我希望重写后问题现在更清楚了。
  • 为什么不将每个集合中列表中的元素并集并检查生成的两个集合是否相等?具体如何发挥取决于您如何表示集合以及如何表示列表。
  • 因为我认为两个列表只有在它们包含相同的元素序列时才相等(直到重命名它们各自集合中的元素)。例如,{[2,2,2], [4,2,3], [1,1,3], [4,2,1]} 不等于 D1 或 D2。
  • 所以你在谈论一些同构的概念,而不是简单的集合相等。一般来说,同构问题很难,因为有 n!候选双射(给定基础集合中的 n 个元素)并且没有某种结构,很难避免暴力解决方案。我的直觉是这是 NP 完全的。

标签: algorithm math matrix data-structures combinatorics


【解决方案1】:

你的问题至少和Graph Isomorphism Problem 一样难。有向图可以表示为一组长度为 2 的列表,这是您的问题的一个特例。此外,已知有向图同构问题与图同构问题具有相同的复杂性。因此,您的问题的一个特例与全图同构问题一样难。图同构的确切复杂性尚不清楚。没有已知的多项式时间算法,尽管它不是 NP 完全的。

由于图同构问题没有简单的解决方案,我怀疑序列化是否会为您的问题提供简单的解决方案。

【讨论】:

  • 感谢您的回答。确实,对于 n=2,这个问题相当于有向图的图规范化,所以在这里序列化似乎无济于事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 2022-01-11
  • 2013-07-17
相关资源
最近更新 更多