置换的逆?
Inverse of a permutation?
有人能解释一下这个例子及其答案吗?我知道如果一个数组有 {3,2,6} 那么它的倒数就是 {6,2,3}。这是被问到的,因为下面的一段代码似乎没有实现这个目标吗?
假设数组 int pi[128] 包含数字 0, 1, ...., 127 的排列。
您会使用哪一两行 Java 代码来高效地生成
pi 在数组 ip[128]?
答案:
for (i=0; i<128; ++i)
ip[pi[i]] = i
不知道你在哪里看到的那个答案,因为它是错误的。
为了说明,让我们使用大小为 4 的数组。
使用 pi = {3,0,1,2}
,结果为 ip = {1,2,3,0}
.
或者 pi = {0,1,2,3}
变成 ip = {0,1,2,3}
.
不知道 "inverse" 这个词的定义是什么,应该是正确的结果。
正确答案是:
for (int i = 0; i < 128; ++i)
ip[i] = pi[127 - i];
跟进@Andreas 的回答。您的答案只是复制数组。我看不出如何调用 "inversing" 数组。我创建了一些示例,根据问题设置数组(元素较少)并打印结果。
示例 "inverse" 的数组并打印结果
import java.util.Arrays;
public class HelloWorld{
public static void main(String []args){
int arrayLength = 10;
int[] pi= new int[arrayLength];
int[] ip = new int[arrayLength];
int i =0;
for (i=0; i<arrayLength; ++i)
pi[i] = i;
for (i=0; i<arrayLength; ++i)
ip[pi[(arrayLength-1)-i]] = i;
System.out.println("pi: "+Arrays.toString(pi));
System.out.println("ip: "+Arrays.toString(ip));
}
}
结果
pi: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ip: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
基于问题答案的示例
import java.util.Arrays;
public class HelloWorld{
public static void main(String []args){
int arrayLength = 10;
int[] pi= new int[arrayLength];
int[] ip = new int[arrayLength];
int i =0;
for (i=0; i<arrayLength; ++i)
pi[i] = i;
for (i=0; i<arrayLength; ++i)
ip[pi[i]] = i;
System.out.println("pi: "+Arrays.toString(pi));
System.out.println("ip: "+Arrays.toString(ip));
}
}
结果
pi: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ip: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
答案错误(甚至无法编译)。
ip
数组将包含每个数字的 索引 ,而不是 "inverse"。
在排列顺序的情况下,结果数组将与输入相同:
int[] pi = {0, 1, 2, 3, 4};
int[] ip = new int[5];
for (int i = 0; i < 5; ++i)
ip[pi[i]] = i;
System.out.println(Arrays.toString(ip));
输出:
[0, 1, 2, 3, 4]
无论 "inverse" 是什么意思,我敢打赌它并不意味着 "the same"。你的例子强烈表明它意味着 "reverse","answer" 显然不会产生。
根据你的问题,恕我直言,你的教授缺乏知识和经验,也不是抽屉里最锋利的刀。我的建议是尽快找到另一位老师。
这是置换 $\pi$ 的 "inverse permutation",在任何数学家都会使用的意义上。 http://mathworld.wolfram.com/InversePermutation.html
逆排列是通过在数组中元素值指定的位置插入元素的位置而得到的排列。
有人能解释一下这个例子及其答案吗?我知道如果一个数组有 {3,2,6} 那么它的倒数就是 {6,2,3}。这是被问到的,因为下面的一段代码似乎没有实现这个目标吗?
假设数组 int pi[128] 包含数字 0, 1, ...., 127 的排列。
您会使用哪一两行 Java 代码来高效地生成 pi 在数组 ip[128]?
答案:
for (i=0; i<128; ++i)
ip[pi[i]] = i
不知道你在哪里看到的那个答案,因为它是错误的。
为了说明,让我们使用大小为 4 的数组。
使用 pi = {3,0,1,2}
,结果为 ip = {1,2,3,0}
.
或者 pi = {0,1,2,3}
变成 ip = {0,1,2,3}
.
不知道 "inverse" 这个词的定义是什么,应该是正确的结果。
正确答案是:
for (int i = 0; i < 128; ++i)
ip[i] = pi[127 - i];
跟进@Andreas 的回答。您的答案只是复制数组。我看不出如何调用 "inversing" 数组。我创建了一些示例,根据问题设置数组(元素较少)并打印结果。
示例 "inverse" 的数组并打印结果
import java.util.Arrays;
public class HelloWorld{
public static void main(String []args){
int arrayLength = 10;
int[] pi= new int[arrayLength];
int[] ip = new int[arrayLength];
int i =0;
for (i=0; i<arrayLength; ++i)
pi[i] = i;
for (i=0; i<arrayLength; ++i)
ip[pi[(arrayLength-1)-i]] = i;
System.out.println("pi: "+Arrays.toString(pi));
System.out.println("ip: "+Arrays.toString(ip));
}
}
结果
pi: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ip: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
基于问题答案的示例
import java.util.Arrays;
public class HelloWorld{
public static void main(String []args){
int arrayLength = 10;
int[] pi= new int[arrayLength];
int[] ip = new int[arrayLength];
int i =0;
for (i=0; i<arrayLength; ++i)
pi[i] = i;
for (i=0; i<arrayLength; ++i)
ip[pi[i]] = i;
System.out.println("pi: "+Arrays.toString(pi));
System.out.println("ip: "+Arrays.toString(ip));
}
}
结果
pi: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ip: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
答案错误(甚至无法编译)。
ip
数组将包含每个数字的 索引 ,而不是 "inverse"。
在排列顺序的情况下,结果数组将与输入相同:
int[] pi = {0, 1, 2, 3, 4};
int[] ip = new int[5];
for (int i = 0; i < 5; ++i)
ip[pi[i]] = i;
System.out.println(Arrays.toString(ip));
输出:
[0, 1, 2, 3, 4]
无论 "inverse" 是什么意思,我敢打赌它并不意味着 "the same"。你的例子强烈表明它意味着 "reverse","answer" 显然不会产生。
根据你的问题,恕我直言,你的教授缺乏知识和经验,也不是抽屉里最锋利的刀。我的建议是尽快找到另一位老师。
这是置换 $\pi$ 的 "inverse permutation",在任何数学家都会使用的意义上。 http://mathworld.wolfram.com/InversePermutation.html
逆排列是通过在数组中元素值指定的位置插入元素的位置而得到的排列。