ホームページ >バックエンド開発 >Golang >ある文字列スライスの中で、別の文字列スライスにはない要素を効率的に見つけるにはどうすればよいでしょうか?

ある文字列スライスの中で、別の文字列スライスにはない要素を効率的に見つけるにはどうすればよいでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-08 20:43:10137ブラウズ

How to Efficiently Find the Elements in One String Slice That Are Not in Another?

2 つの文字列スライスの違いを見つける

プログラミングで文字列スライスを扱うとき、多くの場合、2 つのセット間の違いを判断する必要があります。次のシナリオを考えてみましょう:

slice1 := []string{"foo", "bar","hello"}
slice2 := []string{"foo", "bar"}

私たちの目標は、スライス 1 には存在するがスライス 2 には存在しない要素を識別して出力することです。

効率的な検索のためのハッシュマップの利用

差を効率的に計算するには、Go マップを活用できます。 Go のマップは定数時間 (O(1)) ルックアップを提供し、セット内に要素が存在するかどうかを迅速に判断できます。

差分関数の実装

マップを使用した差分関数の実装は次のとおりです:

// difference returns the elements in `a` that aren't in `b`.
func difference(a, b []string) []string {
    mb := make(map[string]struct{}, len(b))
    for _, x := range b {
        mb[x] = struct{}{}
    }
    var diff []string
    for _, x := range a {
        if _, found := mb[x]; !found {
            diff = append(diff, x)
        }
    }
    return diff
}

分解関数

  • slice2 の長さに等しい容量のマップ mb が作成されます。このマップは、slice2 の要素をキーとして保存し、事実上セットを作成します。
  • slice2 を反復処理し、各要素をキーとして mb に追加します。
  • slice1 の各要素について、次のチェックを行います。 mb にキーとして存在する場合。そうでない場合は、スライス 1 に固有の要素を保持する diff スライスに追加します。
  • 最後に、結果として diff スライスを返します。

この実装の時間計算量はおよそ O(n) です。ここで、n はスライス 1 とスライス 2 の最大長です。その効率はマップによって実行される定数操作に由来しており、これにより検索と挿入が高速になります。

以上がある文字列スライスの中で、別の文字列スライスにはない要素を効率的に見つけるにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。