序列计算算法

时间:2012-09-14 23:33:06

标签: algorithm permutation

我正在寻找一个算法或伪代码的提示,这有助于我计算序列。 这是一种排列,但不完全是因为它不是固定的长度。 输出序列应如下所示:

A
B
C
D
AA
BA
CA
DA
AB
BB
CB
DB
AC
BC
CC
DC
AD
BD
CD
DD
AAA
BAA
CAA
DAA
...

上面的每个字符实际上都代表一个整数,它从最小值增加到最大值。 我开始时不知道深度,所以只使用多个嵌套for循环将无效。

在德国已经很晚了,我无法绕过这个问题。很确定它可以通过for循环和递归来完成,但我目前还没有关于如何开始的线索。

有什么想法吗?

编辑:B-typo纠正。

5 个答案:

答案 0 :(得分:1)

看起来你正在使用长度为1,2,3等的四个不同数字的所有组合,允许重复。

首先从长度1开始:{A,B,C,D}

要获得长度2,请将A,B,C,D依次添加到长度为1的每个成员中。(16个元素)

要获得长度3,请将A,B,C,D依次添加到长度为2的每个成员中。(64个元素)

要获得长度4,请将A,B,C,D依次添加到长度为3的每个成员中。(256个元素)

等等。

如果您有更多或更少的数字,相同的方法将起作用。如果你允许A比较等于B,那会变得有点棘手,但这看起来不像你现在正在做的那样。

答案 1 :(得分:0)

你的序列看起来更像(A n-1 XA T ),其中A是矩阵,A T 是它的转置。 / p>

A= [A,B,C,D]
  

A T X A n-1 ∀(n = 0)

     

序列= A,B,C,D

     

A T X A n-1 ∀(n = 2)

     

序列= AA,BA,CA,DA,AB,BB,CB,DB,AC,BC,CC,DC,AD,BD,CD,DD

您可以使用任何矩阵乘法代码,例如this并实现您想要的内容。

答案 2 :(得分:0)

你有4个元素,你只是用反向的基数4表示法循环数字。假设A = 0,B = 1,C = 2,D = 3:
首先从0到3循环1位数 2位数字从00到33的第二个循环
等等

i    reversed i    output using A,B,C,D digits
loop on 1 digit
0    0             A
1    1             B
2    2             C
3    3             D

loop on 2 digits
00   00            AA
01   10            BA
02   20            CA
03   30            DA
10   01            AB
11   11            BB
12   21            CB
13   31            DB
20   02            AC
21   12            BC
22   22            CC
...

算法非常明显。您可以在fascicle 3a TAOCP D. Knuth中查看算法L(词典t组合生成)。

答案 3 :(得分:0)

根据OP的评论,这里是一种在不存储列表的情况下执行序列的方法。

使用里程表类比。这只需要跟踪指数。每次序列的第一个成员循环时,向右递增一个。如果这是第一次序列成员循环,那么在序列中添加一个成员。

增量需要级联。这相当于从99,999到100,000英里(逗号是数千个标记)。

如果你有一千个需要循环的整数,那么假装你正在看1000基础的里程表,而不是上面的10基础。

答案 4 :(得分:0)

怎么样:

  Private Sub DoIt(minVal As Integer, maxVal As Integer, maxDepth As Integer)
    If maxVal < minVal OrElse maxDepth <= 0 Then
      Debug.WriteLine("no results!")
      Return
    End If
    Debug.WriteLine("results:")

    Dim resultList As New List(Of Integer)(maxDepth)

    ' initialize with the 1st result: this makes processing the remainder easy to write.
    resultList.Add(minVal)
    Dim depthIndex As Integer = 0
    Debug.WriteLine(CStr(minVal))

    Do

      ' find the term to be increased
      Dim indexOfTermToIncrease As Integer = 0
      While resultList(indexOfTermToIncrease) = maxVal

        resultList(indexOfTermToIncrease) = minVal

        indexOfTermToIncrease += 1
        If indexOfTermToIncrease > depthIndex Then
          depthIndex += 1
          If depthIndex = maxDepth Then
            Return
          End If
          resultList.Add(minVal - 1)
          Exit While
        End If
      End While

      ' increase the term that was identified
      resultList(indexOfTermToIncrease) += 1

      ' output
      For d As Integer = 0 To depthIndex
        Debug.Write(CStr(resultList(d)) + " ")
      Next
      Debug.WriteLine("")

    Loop

  End Sub

那会足够吗?它不占用太多内存而且相对较快(除了写入输出......)。