>백엔드 개발 >Golang >Go에서 목록의 모든 순열을 효율적으로 생성하려면 어떻게 해야 합니까?

Go에서 목록의 모든 순열을 효율적으로 생성하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-07 16:44:14798검색

How Can I Efficiently Generate All Permutations of a List in Go?

Go에서 모든 순열 생성: 효율적인 접근 방식

데이터세트를 처리할 때 요소 목록의 가능한 모든 순열을 생성해야 하는 경우가 많습니다. Go는 효율적인 순열 생성을 가능하게 하는 강력한 프로그래밍 환경을 제공합니다.

힙의 알고리즘은 순열 생성을 위한 잘 알려진 방법입니다. 요소 쌍을 교환하여 이전 순열로부터 각 순열을 구성합니다. 다음 힙 알고리즘 구현은 배열의 모든 순열을 반환합니다.

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
}

다음은 이 함수의 사용법을 보여주는 예입니다.

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]]

순열은 사전순으로 정렬되지 않습니다. 정렬된 순열을 얻으려면 순열에 대한 링크된 문서에 설명된 대로 계승 숫자 시스템을 사용하여 생성하는 것이 좋습니다.

Go에서 순열을 생성하기 위한 기타 리소스는 다음과 같습니다.

  • [종합 가이드 순열에 생성](https://www.section.io/engineering-education/go-generate-all-permutations-of-a-list/)
  • [GitHub에서 Go 구현](https://github .com/senghoo/golang-permutations)
  • [Python의 itertools.permutations()와 동일 이동](https://stackoverflow.com/questions/9179817/permutations-in-go)

위 내용은 Go에서 목록의 모든 순열을 효율적으로 생성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.