Java - 在元素随机化后恢复列表的原始顺序

时间:2012-01-27 21:04:12

标签: java list

标题是自我解释的。这是一个面试问题。在java中,List是一个接口。所以它应该由一些集合初始化。

我觉得混淆这是一个棘手的问题。我是否正确?如何回答这个问题?

3 个答案:

答案 0 :(得分:3)

假设您没有原始List的副本,并且随机化算法是真正随机的,那么不,您无法恢复原始List。

对于这类问题,解释比答案要重要得多。为了能够完整地解释它,您需要使用Function和Map的数学定义(而不是Java类定义)来描述它。

功能是一个域中的元素到另一个域的映射。在我们的示例中,第一个域是第一个列表中的“顺序”,第二个域是第二个列表中的“顺序”。从第一个域到第二个域的任何方式,其中第一个域中的每个元素仅转到第二个域中的一个元素是一个函数。

他们想知道的是知道是否存在反函数或相应的函数,它可以将元素从第二个域“反映”到第一个域中的元素。某些函数(平方数,或F(x)= x * x)无法反转,因为第二个域中的一个元素可能映射回第一个域中的多个(或没有)元素。在平方数字例子中

F(x) = x * x
F(3) = 9     or (  3 -> 9)
F(12) = 144  or ( 12 -> 144)
F(-11) = 121 or (-11 -> 121)
F(-3) = 9    or ( -3 -> 9)

尝试反函数,我们需要一个函数

9 maps to 3
144 maps to 12
121 maps to -11
9 maps to -3

由于9必须映射到3和-3,并且Map必须每个原点只有一个目标,因此不可能构造x * x的反函数;这就是为什么数学家用平方根算子捏造并说(加或减)。

回到我们的随机列表。如果您知道地图是真正随机的,那么您就知道输出值真正独立于输入值。因此,如果您尝试创建反函数,则会遇到delimma。知道函数是随机的,告诉你无法从输出中计算输入,所以即使你“知道”函数,即使你有输出,也不能对输入做出任何假设。

除非它是伪随机的(只是看起来是随机的),你可以收集足够的信息来反转现在不是真正的随机函数。

答案 1 :(得分:2)

如果您没有保留一些外部订单信息(这包括诸如带有重影副本的JVM欺骗之类的东西),并且这些项目没有隐式排序,则无法恢复原始订购。

当信息丢失时,它就会丢失。如果列表的结构是记录您想要的订单的唯一地方,并且您打扰了该订单,它就会消失。

答案 2 :(得分:0)

有一个用户的视图,并且有内部。理解的问题和可以解释的问题。

用户的视图是列表项是内存块,并且指向下一项的指针是一组(4?8?它们不断更改数字:)这个内存中的字节。因此,当列表被随机化并且指向下一个项目的指针被更改时,该内存区域将被覆盖并且无法恢复。

理解的问题是,在随机化后给你一份清单。

内部 - 我不是Java或操作系统的人,但你应该研究一下执行进程的方式与天真的看法不同的情况:也许Java通过复制所有单元格随机化列表,所以旧的列表仍然保存在内存中?也许它保留了指针的备份值?也许指针保存在外部表中,与列表分开,可以重建?也许。内件。

了解 - 谁说你在随机化之前无法访问该列表?你可以把它打印出来!或许你有执行的痕迹?或者谁说你正在使用Java的内置列表?也许你正在使用自己的版本控制列表?或者你可能正在使用自己的可逆随机方法?

埃德温巴克的答案很棒,但这完全取决于面试官所寻找的。