如何按字典序遍历所有可能的一定长度的向量?
How to loop over all possible vectors of certain length in lexicographic order?
假设我们有一个长度为 4 的向量,其中每个元素可以是 0 到 9 之间的数字。例如:<1, 8, 0, 3>
我不想简单地循环所有 10^4 个可能的向量,而是想按特定顺序循环。所以我想从<0, 0, 0, 0>
开始,到<1, 0, 0, 0>
,然后:
<2, 0, 0, 0>, <3, 0, 0, 0>, ..., <9, 0, 0, 0>, <0, 1, 0, 0>
等等(注意最后两个的顺序)。我想不出一种方法来为可变向量长度编写这个。
假设我们处于第 i 次迭代中,具有我上面提到的词典顺序中的第 i
个向量。拥有第 i
个向量对于在第 (i+1)
个向量中执行某些过程是必要的。该方案通过随机循环遍历所有可能的向量来节省计算。
我还没有真正找到解决这个问题的非暴力和内存有效的方法。特别考虑到我应该能够支持可变向量长度和不同范围的条目数字。
所以在这种情况下,您可以将每个元素视为以 10 为底数的数字。第 i
个元素是以 10 为底数的 i
,数字按相反顺序排列。例如:
int[] indexToElement(int index, int base) {
String string = Integer.toString(index, base);
int[] element = new int[string.length()];
for (int i = 0; i < string.length(); ++i) {
element[i] = Character.digit(string.charAt(string.length() - i - 1), base);
}
return element;
}
假设我们有一个长度为 4 的向量,其中每个元素可以是 0 到 9 之间的数字。例如:<1, 8, 0, 3>
我不想简单地循环所有 10^4 个可能的向量,而是想按特定顺序循环。所以我想从<0, 0, 0, 0>
开始,到<1, 0, 0, 0>
,然后:
<2, 0, 0, 0>, <3, 0, 0, 0>, ..., <9, 0, 0, 0>, <0, 1, 0, 0>
等等(注意最后两个的顺序)。我想不出一种方法来为可变向量长度编写这个。
假设我们处于第 i 次迭代中,具有我上面提到的词典顺序中的第 i
个向量。拥有第 i
个向量对于在第 (i+1)
个向量中执行某些过程是必要的。该方案通过随机循环遍历所有可能的向量来节省计算。
我还没有真正找到解决这个问题的非暴力和内存有效的方法。特别考虑到我应该能够支持可变向量长度和不同范围的条目数字。
所以在这种情况下,您可以将每个元素视为以 10 为底数的数字。第 i
个元素是以 10 为底数的 i
,数字按相反顺序排列。例如:
int[] indexToElement(int index, int base) {
String string = Integer.toString(index, base);
int[] element = new int[string.length()];
for (int i = 0; i < string.length(); ++i) {
element[i] = Character.digit(string.charAt(string.length() - i - 1), base);
}
return element;
}