>백엔드 개발 >Golang >Go에서 하나의 정수 슬라이스가 다른 정수 슬라이스의 하위 집합인지 효율적으로 확인하는 방법은 무엇입니까?

Go에서 하나의 정수 슬라이스가 다른 정수 슬라이스의 하위 집합인지 효율적으로 확인하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-26 17:12:30394검색

How to Efficiently Determine if One Integer Slice is a Subset of Another in Go?

Go에서 정수 슬라이스를 사용한 하위 집합 검사

한 슬라이스가 다른 슬라이스의 하위 집합인지 효율적으로 결정하는 것은 프로그래밍에서 일반적인 문제입니다. 적절한 접근 방식이 없으면 비교를 위해 슬라이스의 각 요소를 반복하는 데 시간이 많이 걸릴 수 있습니다.

최적의 솔루션: 맵 기반 접근 방식

이 문제에 대한 효율적인 솔루션은 맵 데이터 구조를 활용합니다. . 작동 방식은 다음과 같습니다.

<code class="go">package main

import "fmt"

func subset(first, second []int) bool {
    set := make(map[int]int)
    for _, value := range second {
        set[value] += 1
    }

    for _, value := range first {
        if count, found := set[value]; !found {
            return false
        } else if count < 1 {
            return false
        } else {
            set[value] = count - 1
        }
    }

    return true
}

func main() {
    fmt.Println(subset([]int{1, 2, 3}, []int{1, 2, 3, 4})) // true
    fmt.Println(subset([]int{1, 2, 2}, []int{1, 2, 3, 4})) // false
}</code>

이 접근 방식은 다음과 같습니다.

  1. 두 번째 슬라이스의 요소를 개수와 함께 저장하는 맵(세트)을 만듭니다.
  2. 첫 번째 슬라이스를 반복하고 각 요소가 맵에 존재하는지 확인합니다. 요소가 발견되지 않으면 슬라이스는 하위 집합이 아닙니다.
  3. 요소가 발견되면 맵에서 해당 개수가 감소합니다. 개수가 0이 되면 해당 요소의 모든 인스턴스를 발견한 것입니다.
  4. 모든 검사를 통과하면 true를 반환하여 첫 번째 슬라이스가 두 번째 슬라이스의 하위 집합임을 나타냅니다.

중복 값 처리

위 솔루션도 중복 값을 효과적으로 처리합니다. 예를 들어, 두 번째 슬라이스에는 단 하나의 2만 포함되어 있으므로 {1, 2, 2}는 {1, 2, 3, 4}의 하위 집합이 아닙니다. 코드는 맵의 개수를 추적하여 첫 번째 슬라이스에 더 이상 중복되지 않도록 합니다. 두 번째 슬라이스보다 요소가 많습니다.

위 내용은 Go에서 하나의 정수 슬라이스가 다른 정수 슬라이스의 하위 집합인지 효율적으로 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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