当前位置: 首页 > 面试题库 >

在go中生成所有排列

锺离嘉容
2023-03-14
问题内容

我正在寻找一种生成元素列表的所有可能排列的方法。类似于python
itertools.permutations(arr)

permutations ([])
[]

permutations ([1])
[1]

permutations ([1,2])
[1, 2]
[2, 1]

permutations ([1,2,3])
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

区别在于我不在乎排列是按需生成(例如python中的生成器)还是全部生成。我也不关心它们是否按字典顺序排序。我所需要做的就是以某种方式获得这些n!排列。


问题答案:

产生置换的算法很多。我发现的最简单的方法之一是堆算法:

通过选择一对要交换的元素,它会根据前一个生成每个排列。

在上面的链接中概述了这个想法和一个伪代码一个接一个地打印排列。这是我实现的算法的实现,该算法返回所有排列

func permutations(arr []int)[][]int{
    var helper func([]int, int)
    res := [][]int{}

    helper = func(arr []int, n int){
        if n == 1{
            tmp := make([]int, len(arr))
            copy(tmp, arr)
            res = append(res, tmp)
        } else {
            for i := 0; i < n; i++{
                helper(arr, n - 1)
                if n % 2 == 1{
                    tmp := arr[i]
                    arr[i] = arr[n - 1]
                    arr[n - 1] = tmp
                } else {
                    tmp := arr[0]
                    arr[0] = arr[n - 1]
                    arr[n - 1] = tmp
                }
            }
        }
    }
    helper(arr, len(arr))
    return res
}

以下是使用方法的示例(转到Playground):

arr := []int{1, 2, 3}
fmt.Println(permutations(arr))
[[1 2 3] [2 1 3] [3 2 1] [2 3 1] [3 1 2] [1 3 2]]

需要注意的一件事是,排列不是按字典顺序排序的(如您在中所见itertools.permutations)。如果出于某种原因需要对它进行排序,我发现它的一种方法是从阶乘数系统生成它们(在中进行了描述,permutation section并允许快速找到第n个字典编排)。

PS,
您也可以在这里和这里看看其他人的代码



 类似资料:
  • 问题内容: 假设我们有一个字母“ abcdefghiklimnop”。如何以有效的方式递归地生成排列在FIVE组中的此字母重复的排列? 我几天来一直在为此苦苦挣扎。任何反馈将有所帮助。 本质上,这与以下操作相同:生成给定字符串的所有排列 但是,我只希望整个字符串的长度为5。我还无法弄清楚这一点。 因此,对于“ abcdefghiklimnop”的所有长度为5的所有子串,请查找子串的排列。例如,如果

  • 问题内容: 在python中,您可以按以下顺序生成带有键的JSON: 我在Go中找不到类似的选项。有什么想法可以在旅途中实现类似的行为吗? 问题答案: json包在编组时总是对密钥进行排序。特别: 地图按字典顺序对键进行排序 结构键按照结构中定义的顺序编组 该实现位于此处的ATM中: http://golang.org/src/pkg/encoding/json/encode.go?#L359

  • 问题内容: 找到字符串的所有排列的一种优雅方法是什么。例如,的排列会是和,但是较长的字符串呢?有任何实现示例吗? 问题答案:

  • 问题内容: 这是问题: 给定Python中的项目列表,我将如何获得这些项目的所有可能组合? 这个站点上有几个类似的问题,建议使用itertools.combine,但是仅返回我需要的一部分: 如您所见,它仅按严格顺序返回项目,而不返回(2,1),(3,2),(3,1),(2、1、3),(3、1、2),( 2,3,1)和(3,2,1)。有一些解决方法吗?我似乎什么都没想。 问题答案: 用途: 帮助:

  • 问题内容: 如何在Python中生成一个列表的所有排列,独立于该列表中元素的类型? 例如: 问题答案: 从Python 2.6(如果你使用的是Python 3)开始,你可以使用标准库工具:itertools.permutations。 如果你出于某种原因使用旧版Python(),或者只是想知道它的工作原理,那么这是一种不错的方法,取自 http://code.activestate.com/rec

  • 问题内容: 我想使用HiveQL创建一个n-gram列表。我的想法是使用带正则表达式和split函数的正则表达式-但这不起作用,但是: 输入是表格的一列 输出应该是: Hive中有一个n-gram udf,但是该函数直接计算n-gram的频率-我想改为列出所有n-gram的列表。 在此先多谢! 问题答案: 这可能不是最佳的解决方案,但却是可行的解决方案。用定界符分割句子(在我的示例中是一个或多个空