Excel - 确定排列的奇偶性
Excel - Determine Parity of Permutation
我正在处理 Excel sheet,我需要确定大小为 N 的垂直数字数组的奇偶性。该数组包含从 1 到 N 的每个数字恰好一次。
在此上下文中,奇偶校验被定义为从最小到最大将扰乱数组转换为排序数组所需的交换次数。
例如,数组 {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
我正在寻找一种解决方案,该解决方案将 return TRUE
用于偶校验数组,FALSE
用于奇校验数组。 (而且我不关心不包含从 1 到 N 的所有数字的数组的结果是什么,因为我在传播sheet来处理这些情况。)
我想出了一个使用多个辅助列的解决方案,但它似乎是一个缓慢的计算。
我通过检查数组中的每个数字是否在正确的索引中来执行此操作,如果不正确,则执行交换。然后我总结发生的交换量并使用 MOD(<swaps>,2)=0
来确定它是否是偶数。
请参阅下面的数组 {8;5;3;2;4;1;7;6}
.
的示例计算
我对单元格进行了颜色编码,以便轻松判断正在发生的事情:
白色=参考数组{1;2;3;4;5;6;7;8}
蓝色 = 输入数组
灰色 = "helper" 数组,其中每个连续的列在必要时执行交换
红色 = 表示是否发生了前一列的交换
如果该列中发生交换,则绿色 = 1,如果未发生交换,则为 0
黄色 = 所有绿色单元格的总和,有效说明发生了多少次交换。
在这个例子中,由于黄色单元格是 4
,它是一个偶数,所以输入数组具有偶校验。
问题是:在没有 VBA 的情况下 Excel 是否可以更有效地完成此计算?我不一定反对辅助列,但我的解决方案似乎很缓慢,我想知道是否有更好的方法。
我想我有办法在没有辅助列的情况下做到这一点!
首先,我将向您展示一种使用 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 来验证它。这会将大括号括在公式周围。不要手动执行此操作。)
我正在处理 Excel sheet,我需要确定大小为 N 的垂直数字数组的奇偶性。该数组包含从 1 到 N 的每个数字恰好一次。
在此上下文中,奇偶校验被定义为从最小到最大将扰乱数组转换为排序数组所需的交换次数。
例如,数组 {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
我正在寻找一种解决方案,该解决方案将 return TRUE
用于偶校验数组,FALSE
用于奇校验数组。 (而且我不关心不包含从 1 到 N 的所有数字的数组的结果是什么,因为我在传播sheet来处理这些情况。)
我想出了一个使用多个辅助列的解决方案,但它似乎是一个缓慢的计算。
我通过检查数组中的每个数字是否在正确的索引中来执行此操作,如果不正确,则执行交换。然后我总结发生的交换量并使用 MOD(<swaps>,2)=0
来确定它是否是偶数。
请参阅下面的数组 {8;5;3;2;4;1;7;6}
.
我对单元格进行了颜色编码,以便轻松判断正在发生的事情:
白色=参考数组{1;2;3;4;5;6;7;8}
蓝色 = 输入数组
灰色 = "helper" 数组,其中每个连续的列在必要时执行交换
红色 = 表示是否发生了前一列的交换
如果该列中发生交换,则绿色 = 1,如果未发生交换,则为 0
黄色 = 所有绿色单元格的总和,有效说明发生了多少次交换。
在这个例子中,由于黄色单元格是 4
,它是一个偶数,所以输入数组具有偶校验。
问题是:在没有 VBA 的情况下 Excel 是否可以更有效地完成此计算?我不一定反对辅助列,但我的解决方案似乎很缓慢,我想知道是否有更好的方法。
我想我有办法在没有辅助列的情况下做到这一点!
首先,我将向您展示一种使用 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 来验证它。这会将大括号括在公式周围。不要手动执行此操作。)