如何在条件置换后将数组恢复为原始形式

时间:2018-05-22 19:39:56

标签: c# .net algorithm

我的代码:

reserve

我有unpermute数组,进行深层复制,然后,如果var unpermuted = new byte[]{137, 208, 135, 4, 191, 255, 132, 99, 85, 54, 58, 137, 208, 37, 151, 30}; var longKey = new byte[] {75, 79, 84, 69, 197, 129, 75, 65, 74, 65, 75, 75, 79, 84, 69, 197, 129, 75, 65, 74, 65}; var permuted = (byte[])unpermuted.Clone(); for(var i = 0; i < permuted.Length;i++) { if (i > 1 && (permuted[i] < longKey[i])) { var swapCont = permuted[i - 1]; permuted[i - 1] = permuted[i]; permuted[i] = swapCont; } } printArr(unpermuted); Console.WriteLine(); printArr(permuted); // How do I reverse permuted array to unpermuted? Console.WriteLine(); printArr(permuted); } public static void printArr(byte[] arr) { for(var i = 0; i < arr.Length;i++) { Console.Write(arr[i]); Console.Write(" "); } } 高于value,我将与之前的元素交换。

问题是: 如何将置换数组恢复为仅具有 LongKey数组和Permuted数组的无数形式?

1 个答案:

答案 0 :(得分:1)

根据你拥有的信息,不可能“取消”数组。

想象一下,你有以下几点:

longkey = [1,2,3,9,5]
array   = [3,4,9,5,6]

运行代码,结果将为[3,4,5,9,6]

但如果原始数组是[3,4,5,9,6],结果是相同的。

正如您所看到的,原始数组有多个排列可以提供相同的输出。结果中没有足够的信息,longkey数组告诉你原始数组是什么。

一般情况下,如果您在以下任何地方都有3项序列,那么就不可能可靠地反转操作。

longkey = [b, c, d]
array   = [x, y, z]

其中:

b <= x, b <= y
c <  x, c > y
d <= z

例如:

longkey = [...,3,9,5,...]
array   = [...,9,5,6,...]

这里的关键是9永远不能与左边的东西交换,6永远不会与5交换。所以5和9不能移动,除了互相交换位置。如果原始订单为[9,5,6],则最终订单为[5,9,6]。如果原始订单为[5,9,6],则结果再次为[5,9,6]