【问题标题】:Excel - Determine Parity of PermutationExcel - 确定排列的奇偶性
【发布时间】:2018-06-03 07:46:47
【问题描述】:

我正在处理一个 Excel 表,我需要确定大小为 N 的垂直数组的奇偶性。该数组包含从 1N 的每个数字,每次恰好一次。

在这种情况下,奇偶校验定义为将加扰数组从最小到最大转换为排序数组所需的交换次数。

例如,数组{3;1;2;4} 具有偶校验,因为它需要两次交换(至少)才能转换为{1;2;3;4},但总是需要偶数次交换。见下文。

3   -->   1         1
1   -->   3   -->   2
2         2   -->   3
4         4         4

另一个例子:{2;1;4;5;3} 具有奇校验,因为它需要三个交换(至少)才能转换为 {1;2;3;4;5},但总是需要奇数交换。见下文。

2   -->   1         1         1
1   -->   2         2         2
4         4   -->   3         3
5         5         5   -->   4
3         3   -->   4   -->   5

我正在寻找一种解决方案,该解决方案将为偶数奇偶校验的数组返回 TRUE,而奇偶校验的数组返回 FALSE。 (而且我不在乎不包含从 1N 的所有数字的数组的结果是什么,因为我在电子表格中有其他检查来处理这些情况。 )

我想出了一个使用多个辅助列的解决方案,但它似乎是一个缓慢的计算。

我通过检查数组中的每个单独的数字是否在正确的索引中来做到这一点,如果它没有执行交换。然后我总结了发生的交换数量并使用MOD(<swaps>,2)=0 来确定它是否是偶校验。

请参阅下面的数组{8;5;3;2;4;1;7;6} 的示例计算。

我已经对单元格进行了颜色编码,以便轻松判断发生了什么:

白色 = 参考数组{1;2;3;4;5;6;7;8}

蓝色 = 输入数组

Grey = "helper" 数组,其中每个连续列在必要时执行交换

红色 = 表示是否从上一列发生了交换

如果在该列中发生交换,则绿色 = 1,如果没有发生交换,则为 0

黄色 = 所有绿色单元格的总和,有效地说明发生了多少交换。

在这个例子中,由于黄色单元格是4,这是一个偶数,所以输入数组有偶校验。

问题是:在没有 VBA 的 Excel 中,这种计算能否更有效地完成?我不一定反对帮助列,但我的解决方案似乎很慢,我想知道是否有更好的方法。

【问题讨论】:

  • 问题是公式不存储更改,我怀疑没有帮助列方法的方法。
  • @ScottCraner 使用这种方法,我同意。我的问题是,是否有一些我不知道的数学“技巧”来计算。
  • 那么在math.stackexchange.com上可能会更好
  • @ScottCraner 好点,谢谢。
  • @ScottCraner 数组公式来救援!我想我已经没有辅助列了。

标签: excel math excel-formula permutation parity


【解决方案1】:

我想我有办法在没有帮助列的情况下做到这一点!

首先,我将向您展示一种使用 N 辅助列的方法,然后我将展示如何使用数组公式。考虑下面的矩阵:

绿色范围是索引,蓝色范围是您的排列。黄色矩阵是您在公式框中定义的permutation matrix

你的排列的奇偶性与这个矩阵的行列式的值相同!

幸运的是,Excel 有一个内置的行列式函数MDETERM()。偶数排列的奇偶校验位为 1,奇排列的奇偶校验位为 -1,因此您可以通过公式简单地得到行列式

=MDETERM(C2:J9)

现在这很酷,但真正令人兴奋的是我们甚至不需要制作那个矩阵。我们可以用这样的数组公式来构造它:

{=MDETERM(IF(B2:B9=TRANSPOSE(A2:A9),1,0))}

这里我们只使用 A 列和 B 列!此版本中未使用 C:J 列。

(请注意,这是一个数组公式,因此您需要使用 Ctrl+Shift+Enter 来验证它。这会将大括号包裹在公式周围。不要手动执行此操作。)

【讨论】:

  • 我只能说:该死的! 没有意识到矩阵的行列式决定了奇偶性。附带说明一下,在这种情况下,甚至根本不需要 A 行,这使得这个公式在没有任何辅助列的情况下完全可行。将A2:A9 替换为ROW(B2:B9)-ROW(B2)+1,或等效为ROW(B2:B9)-MIN(ROW(B2:B9))+1。再次感谢你的帮助。我认为有一些数学技巧可以减轻工作的痛苦。
  • @ImaginaryHuman072889 这是真的原因是从单位矩阵(单位排列)开始,应用于矩阵的每一行或列交换都会改变行列式的符号。 math.stackexchange.com/questions/221668/…
  • 再次感谢。这是有用的信息,您已经找到了解决此问题的优雅方法。
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 2010-12-02
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多