可变范围值阵列的词典顺序

时间:2012-11-16 19:32:11

标签: algorithm math combinations

我在最近一直试图解决的问题上取得了很多进展,但我可以就特定的订购问题使用一些建议。我正在努力找到一种方法来表示数字列表的词典顺序,每个数字都有自己的范围(在订购之前定义是一个问题)。

每个列表都有 7个元素。每个元素的范围可以从 0到0-3 。也许一个具体的例子会有所帮助。

我有一个包含7个元素的数组[2,1,0,1,3,2,3]。此列表抽象地表示我想要生成字典顺序的许多可能列表。 (编辑:更清楚。每个数字的值代表该数字在可能列表集中的最大值。因此,示例中的第一个数字可以被认为是基数4,第二个数字作为基数2,第三个作为基数1,等等。)此列表的前几个元素如下:

  1. [0,0,0,0,0,0,0]
  2. [1,0,0,0,0,0,0]
  3. [2,0,0,0,0,0,0]
  4. [0,1,0,0,0,0,0]
  5. [1,1,0,0,0,0,0]
  6. [2,1,0,0,0,0,0]
  7. [0,0,0,1,0,0,0]
  8. [1,0,0,1,0,0,0]
  9. 希望模式清晰。然后,我希望能够有效地调用函数f(m),该函数返回此序列中的第m个值。我发现this文章感觉它非常接近我正在寻找的东西(它提供了一种有效的方法来获得具有固定值组合的集合中的词典编纂位置),但我遇到了桥接问题两个想法之间的差距(尽管我已经在文章中重新创建了结果,我相信我对它们有所了解)。

    任何人都有关于如何创建函数f(m)的想法,该函数返回由7元素列表定义的序列中的第m个值,类似于上面示例中提供的那个?

    P.S。如果这个问题已经以其他形式重申并且我没有找到它,我道歉。我已经做了很多重要的搜索,但似乎没有什么能够重新确定这一点。链接,头脑风暴,一般想法都是受欢迎的!

    编辑2:修复了我的示例中的错误,其中第一个元素是3而不是2。

1 个答案:

答案 0 :(得分:1)

编辑:用更直接的转换替换原始答案。如果您真的想要查看后向解决方案,请查看早期版本。

请注意,您提供的初始数组与样本列表不匹配(数组的第一个元素应为2)。我将在答案中使用更正的数组。

给定输入数组[2,1,0,1,3,2,3],每个位置的可能元素数量为

[3,2,1,2,4,3,4]

给我们3 * 2 * 1 * 2 * 4 * 3 * 4 = 576种可能性。

确定最左边(低阶)元素列表的m th 成员的值,其中0 <= m&lt; 576,我们需要找到m / 3或m mod 3的余数。下一个元素是(m div 3)mod 2,依此类推。在伪代码中,然后:

increment all elements of A by 1

// we now have A = [3,2,1,2,4,3,4]
// m is given
// result is in R[7]
for i = 0 to 6
    R[i] = m mod A[i];
    m = m div A[i];
end

如果您将上面的样本列表调整为从0开始,您应该得到相同的结果。这是使用A = [3,2,1,2,4,3,4]和m = 11的样本计算:

11 mod 3 = 2 (11 div 3 = 3)
 3 mod 2 = 1 (3 div 2 = 1)
 1 mod 1 = 0 (1 div 1 = 1)
 1 mod 2 = 1 (1 div 2 = 0)
 0 mod 4 = 0
 0 mod 3 = 0
 0 mod 4 = 0

所以第11个列表元素(从零开始)是[2,1,0,1,0,0,0]。