【发布时间】:2015-08-01 09:02:11
【问题描述】:
输入:一个字符数组和一个置换函数 P。函数 P 以某种确定性的方式对输入进行混洗。例如,如果 P 是(向右推)
1234 -> P -> 4123 -> P -> 3412 -> P -> 2341 -> 1234
在上面的例子中,对一个输入应用 P 四次 次会给你一个输入。 P可以是恒等映射,即require重复为1
1234 -> P -> 1234
P 可以看作是某种映射函数,它最终会打乱输入,P 的输出需要是原始输入的一个排列。 P 可能很复杂,比如交换赔率和偶数;接下来,交换第一个和最后一个,依此类推。
你的工作就是写一个函数,比如说,
public static char[] P(char[] arr) {...} # the content is unknown
public static int getNumRequired(char[] arr) {
// your code here
}
显然,有一个蛮力解决方案 - 通过创建一个 while 循环,我们计算循环数,然后在满足条件时中断循环。这里的问题是:“我们能比蛮力做得更好吗?”
有人告诉我,有一种有效的方法(或更好的方法)来计算需要重复的次数以获得原始输入。
【问题讨论】:
-
这取决于您拥有的置换函数的种类。如果这些是加密哈希函数,那将很难。同样重要的是您要执行哪种设置?一次性反转?多次反转(许多不同的输入值)?在后一种情况下,Rainbow tables 的技术可能是合适的。这些可能对您有用,即使这些只是空间/时间权衡(复杂性没有变化!)
-
是否假设函数应用的排列不依赖于输入中的具体值?
-
是的,函数 P 不依赖于输入值。 P 是给定的,不会改变 w.r.t 输入。如果提供了 P 和 arr,我们的目标是计算出所需的重复次数。
标签: algorithm dynamic-programming