【发布时间】:2018-06-03 07:46:47
【问题描述】:
我正在处理一个 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} 的示例计算。
我已经对单元格进行了颜色编码,以便轻松判断发生了什么:
白色 = 参考数组{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