Algorithm 可变范围值数组的字典顺序

Algorithm 可变范围值数组的字典顺序,algorithm,math,combinations,Algorithm,Math,Combinations,我最近一直在努力解决一个问题,但在这个问题上我取得了很大的进展,但我可以在一个特定的排序问题上提供一些建议。我试图找到一种表示数字列表的字典顺序的方法,每个数字都有自己的范围(在排序之前定义是一个问题)。 每个列表有7个元素。每个元素的范围可以从0到0-3。也许一个具体的例子会有所帮助 我有一个包含7个元素的数组[2,1,0,1,3,2,3]。这个列表抽象地表示了许多可能的列表,我想为这些列表生成一个字典顺序。(编辑:为了更清楚。每个数字处的值表示该数字在一组可能列表中的最大值。因此,示例中的第

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

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

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

  • [0,0,0,0,0,0,0,0,0]
  • [1,0,0,0,0,0,0,0]
  • [2,0,0,0,0,0,0,0,0]
  • [0,1,0,0,0,0,0,0,0]
  • [1,1,0,0,0,0,0,0]
  • [2,1,0,0,0,0,0,0]
  • [0,0,0,1,0,0,0,0]
  • [1,0,0,1,0,0,0]
  • 希望模式是清晰的。然后,我希望能够高效地调用函数f(m),该函数按此顺序返回mth值。我发现这篇文章感觉它非常接近我所寻找的(它提供了一种有效的方法来获得固定值组合集合中的词典第m位),但我很难弥合这两个想法之间的差距(尽管我在文章中重新创建了结果,我相信我对它们有所了解)

    有没有人知道如何创建一个函数f(m),它以7个元素列表定义的顺序返回mth值,类似于上面示例中提供的一个

    另外,如果这个问题以其他形式再次出现,而我没有发现,我深表歉意。我已经做了重要的搜索,但似乎没有什么可以完全追溯到这一点。欢迎链接、头脑风暴、一般想法


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

    编辑:将原始答案替换为更直接的转换。如果您确实想查看反向解决方案,请检查早期版本

    请注意,您给出的初始数组与示例列表不匹配(数组的第一个元素应为2)。我将在回答中使用更正后的数组

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

    [3,2,1,2,4,3,4]
    
    给我们3*2*1*2*4*3*4=576种可能性


    确定列表第m个成员的值,其中0[3,1,0,1,3,2,3]。这个列表抽象地表示了许多可能的列表,我想为这些列表生成一个字典顺序。怎么用?你能更清楚地回答这个问题吗?原始数组中的每个值表示数组中该位置可能值范围内的最大值。因此,您可以看到示例中的第一个值是3。这意味着该数字可以有0到3的值。您可以在有序列表中看到,这些值像基数4一样循环。类似地,1表示基数2,2表示基数3,0表示基数1。我想你可以根据每个基重写数组,如果这能让问题更清楚的话。它不会影响整个问题。这有帮助吗?我应该指出,[2,12,60,60]代表每天的时钟时间:上午/下午、小时、分钟、秒。一般来说,您所做的是多基算术,其中每列都有不同的基,相应地,有不同的“位数”。我修复了示例中的错误。我不知道为什么我没有想到这一点!非常感谢你!现在它很有道理了。@user986122是的,如果你看看我原来的解决方案,它真的很难看。我必须把它和十进制到二进制的转换联系起来才能真正看到它。
    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
    
    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