Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 序列计算算法_Algorithm_Permutation - Fatal编程技术网

Algorithm 序列计算算法

Algorithm 序列计算算法,algorithm,permutation,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循环和递归可以完成,但我目前还不知道如何开始 有

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

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更正。

您的序列看起来更像(A-1 X AT),其中A是矩阵,AT是转置

A= [A,B,C,D]
在X An-1∀ (n=0)

顺序=A、B、C、D

在X An-1∀ (n=2)

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


您可以选择任意矩阵乘法代码,并实现所需的功能。

看起来您选择了长度为1、2、3等的四个不同数字的所有组合,允许重复

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

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

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

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

等等


如果您有更多或更少的数字,同样的方法也会起作用。如果你允许,比如说,a等于B,它会变得有点棘手,但这看起来不像你现在所做的。

如果你有4个元素,你只是在用相反的基数4表示法循环数字。假设A=0,B=1,C=2,D=3:
第一个循环从0到1位数字上的3
两位数字上从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
...

算法非常明显。您可以查看中的算法L(字典式t组合生成)。

根据OP中的注释,这里有一种不存储列表的方法来完成序列

用里程表类比。这只需要跟踪索引。每次序列的第一个成员循环时,增加右边的一个。如果这是序列的该成员第一次循环,则向序列中添加一个成员

增量将需要级联。这相当于从99999英里到100000英里(逗号是千分标记)

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

怎么样:

  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
Private子DoIt(minVal为整数,maxVal为整数,maxDepth为整数)
如果maxVal

这是否足够?它不占用太多内存,而且速度相对较快(除了写入到输出…。

好主意,我只是玩了一下,但是你的评论似乎不完整。是的,5分钟的事情。。。我想说:好主意,我只是玩了一下,但是有一个陷阱:不是数字,而是实际数字和很多数字(现在从0-1000测试)。我尝试将它们存储在一个列表中,很快就会导致OutOfMemoryException(在第三个“维度”之后)。我不在乎这场跑步是否持续了几个小时,但它必须要跑。。。如果不保存以前的结果,有什么想法吗?我发布了另一个答案,它不需要存储列表。是的,但我不知道我将实际拥有多少元素。这是在过程中确定的。如果您不知道将有多少元素,那么您必须在输出之前保留一个列表。。。每字符串大小一个列表,每次发现新元素时都必须完成。。。