确保只有一个公式可以应用于4个随机元素

本文关键字:应用于 4个 随机 元素 有一个 确保 | 更新日期: 2023-09-27 18:20:27

我有一个组合元素的公式列表:

A + B + C = X
D + E + F = Y
G + H + I = Z

我想确保,给定任意4个随机元素,适用的公式永远不会超过1个。例如,下面的公式不应该被允许,因为如果我得到元素A、B、C和D,那么两者都适用:

A + B + C = X
B + C + D = Y

每个公式都由LHS上的3个元素组成,我想对它执行规则如果有帮助的话,这些元素是可排序的。


另一个等效问题:

我有一个由3个元素组成的数组的列表:List<Element[3]>我如何确保没有2个元素出现在多个数组中。


对于大量的元素和大量的公式(除了暴力),什么是合理有效的(运行时速度)方法?

确保只有一个公式可以应用于4个随机元素

从本质上讲,这归结为一个排除问题:从您的示例数据来看,

  • 第一个公式适用于集合(A,B,C,X),或者如果X是常数
  • 第二个公式适用于(D,E,F,Y)或(D,E,F)
  • 等等

你想确保,任何新的条目到列表

  • 不对列表中已存在的集合进行操作(如(a,B,C[,X]))
  • 不对列表中已存在的条目的子集进行操作(如(a,B)),因为在这种情况下,输入元组(a、B、C[,X])将对现有公式和新公式进行操作

根据元组的大小,创建一个详尽的子集列表可能很昂贵,也可能不是

这应该适用于小集合(子集的廉价列表)

Keep dictionary of formulas
On new formula
  Normalize variable list (e.g. (D,A,c)=>"ACD")
  Check if normalized variable list exists in dictionary
  If it exists, reject new formula and break
  For all subsets of variable list
    Check if normalized variable list of subset exists in dictionary
    If it exists, reject new formula and break
  End For
End On

您可以将方程组上的约束表示为图。顶点是元素,其中n[i]元素在方程i中。对于方程i,因此存在n[i]*(n[i]-1)/2对元素;这些变成了边缘。遍历方程式,将边添加到图形中。每当你想添加一个已经存在的边时,你就会发现一个冲突。

对于每条边,您可以存储一组方程式编号,这些编号将生成边;这允许识别特定的冲突,而不仅仅是冲突的存在。

N是方程的数量,M是方程中元素最多的元素的数量。时间复杂度为O(M^2*N),空间复杂度也是如此。如果所有方程都有固定数量的元素,那么时间和空间的使用将因此是O(N)

此解决方案的灵感来自Michael J.Barber的解决方案。

  1. 初始化哈希表

  2. 当您有一个包含M个变量的方程时,将所有大小为M-1的组合添加到哈希表中。例如:对于A+B+C+D=Z,添加(A,B,C),(A,B,D),(A,C,D)和(B,C,D)

  3. 当您想测试一个具有M个变量的新方程的可能性时,请检查是否所有M-1个子集都不在哈希中。

复杂性:O(mnlog(mn))。

你可以从另一方面定义这个问题:没有任何一对公式的元素并集包含少于5个元素。它指向一种算法,该算法在每对公式通过测试时对其进行比较。我知道这是一种蛮力,但我真的无法想象有什么比atm更好的了。

也许您可以利用一些LINQ集合操作。既然你把你的问题描述为有一个列表,想要"确保没有2个元素出现在一个以上的列表中",难道这也不能被描述为检查任何列表之间是否存在交集吗?还是我有点偏离了这里?

James Michael Hare有一篇关于LINQ中各种集合操作的好文章。您可以先看一下:-)

将值存储在矩阵中,并确保matrix[i][j]!=矩阵[k][j]与i!=k.

更新:

这种方法在求解线性方程组问题时经常使用。矩阵中的元素表示多项式函数的系数。然后,您可以在行之间进行操作,将矩阵转换为特殊形式。

但在这种情况下,您只需要将元素存储在矩阵中,并在添加行(元素的某些组合)之前验证矩阵。

这种方法的优点是最有效,但您需要正确处理初始大小和调整大小策略。

更新2:

A + B + C = X
B + C + D = Y
m[0][1] = B
m[1][0] = B

这个例子打破了规则矩阵[i][j]!=矩阵[k][j]与i!=k

那么您就不能使用公式B+C+D=Y,因为A+B+C=X。