Maison >développement back-end >Golang >Comment puis-je déterminer efficacement les relations de sous-ensembles en Go à l'aide de tranches entières ?

Comment puis-je déterminer efficacement les relations de sous-ensembles en Go à l'aide de tranches entières ?

DDD
DDDoriginal
2024-10-26 12:46:021082parcourir

How Can I Efficiently Determine Subset Relationships in Go Using Integer Slices?

Vérifier efficacement les relations de sous-ensembles avec des tranches entières dans Go

Déterminer si une tranche est un sous-ensemble d'une autre est une tâche de calcul courante. Dans Go, il existe différentes approches pour y parvenir, offrant différents niveaux d'efficacité.

Une méthode simple consiste à parcourir les éléments des deux tranches, en comparant chaque élément de la plus petite tranche aux éléments de la plus grande tranche. . Cependant, cette approche peut être coûteuse en termes de calcul pour les grandes tranches en raison de la nature itérative de la vérification.

Il existe une approche alternative qui exploite une structure de données cartographiques pour obtenir une plus grande efficacité. Cette approche exploite la propriété de différence définie, où les éléments de la plus petite tranche sont soustraits de la plus grande tranche pour déterminer s'il reste des éléments.

Voici comment implémenter cette approche dans Go :

package main

import "fmt"

// subset returns true if the first array is completely
// contained in the second array. There must be at least
// the same number of duplicate values in second as there
// are in first.
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}))
    fmt.Println(subset([]int{1, 2, 2}, []int{1, 2, 3, 4}))
}

Dans cette implémentation, une carte est utilisée pour stocker les éléments de la plus grande tranche et leurs décomptes correspondants. Itérer sur les éléments de la plus petite tranche implique d'accéder aux décomptes de la carte et de les décrémenter. Si un élément manquant est rencontré dans la plus petite tranche (introuvable sur la carte) ou si le nombre tombe en dessous de 0 (indiquant moins d'éléments dans la plus grande tranche que dans la plus petite), la fonction renvoie false, indiquant que la plus petite tranche n'est pas un sous-ensemble. La complexité temporelle de cette approche est nettement inférieure à celle de l'approche itérative, ce qui la rend plus efficace pour les grandes tranches.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn