我正在处理Excel工作表,需要确定大小为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


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

我已经找到了使用多个帮助程序列的解决方案,但这似乎是一种缓慢的计算。

我通过检查数组中的每个数字是否在正确的索引中以及是否不执行交换来实现此目的。然后,我总结发生的交换数量,并使用MOD(<swaps>,2)=0来确定它是否是奇偶校验。

有关使用数组{8;5;3;2;4;1;7;6}的示例计算,请参见下文。

excel - Excel-确定排列的奇偶性-LMLPHP

我已经对单元格进行了颜色编码,以轻松判断正在发生的事情:

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

蓝色=输入数组

Gray =“ helper”数组,其中每个连续的列在必要时执行交换

红色=指示是否与上一列发生了交换

如果该列中发生了交换,则绿色= 1;如果未发生交换,则为0

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

在此示例中,由于黄色单元格为4(偶数),因此输入数组具有奇偶校验。

问题是:在没有VBA的情况下,可以在Excel中更有效地完成此计算吗?我不一定要反对辅助专栏,但同样,我的解决方案似乎呆滞,我想知道是否有更好的方法。

最佳答案

我想我有一种无需助手列的方法!

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

excel - Excel-确定排列的奇偶性-LMLPHP

绿色范围是索引,蓝色范围是您的排列。黄色矩阵是您的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 - Excel-确定排列的奇偶性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47911294/

10-09 03:32