Golang で順序付けされた配列の共通部分を計算するための効率的なアルゴリズムには、1 つずつの比較 (O(mn))、二分探索 (O(m log n) または O(n log m))、およびマップの使用 (O (m n) )、m と n は配列の長さです。
2 つの順序付けされた配列の交差を計算することは、Golang の一般的なタスクです。この問題を解決するためのアルゴリズムは、単純な 1 つずつの比較から、バイナリ検索や高度なデータ構造を利用した効率的な方法まで、いくつかあります。
最も簡単な方法は、2 つの配列の各要素を順番に比較することです。一致する要素が見つかると、その要素が結果の配列に追加されます。ただし、このアプローチの時間計算量は O(mn) です。ここで、m と n は 2 つの配列の長さです。配列が大きい場合、このアプローチは非常に遅くなる可能性があります。
func intersect_naive(arr1, arr2 []int) []int { result := []int{} for i := 0; i < len(arr1); i++ { for j := 0; j < len(arr2); j++ { if arr1[i] == arr2[j] { result = append(result, arr1[i]) } } } return result }
より効率的な方法は、二分検索を使用することです。配列内の各要素について、二分検索を使用して、それが別の配列内にあるかどうかを確認できます。これにより、配列のサイズに応じて、時間計算量は O(m log n) または O(n log m) になります。
func intersect_binary_search(arr1, arr2 []int) []int { result := []int{} for _, v := range arr1 { if exists := binarySearch(arr2, v); exists { result = append(result, v) } } return result } func binarySearch(arr []int, target int) bool { left, right := 0, len(arr)-1 for left <= right { mid := left + (right-left)/2 if arr[mid] == target { return true } else if arr[mid] < target { left = mid + 1 } else { right = mid - 1 } } return false }
マップ (ハッシュ テーブル) の使用は、交差を計算するもう 1 つの効率的な方法です。要素をマップ内のキーとして配列に保存し、各要素が出現する回数を記録できます。次に、別の配列を反復処理して、各要素がマップ内にあるかどうかを確認します。存在する場合は、それを結果配列に追加し、カウントを更新します。これにより、時間計算量は O(m n) になります。ここで、m と n は 2 つの配列の長さです。
func intersect_map(arr1, arr2 []int) []int { result := []int{} m := make(map[int]int) for _, v := range arr1 { m[v]++ } for _, v := range arr2 { if count, ok := m[v]; ok { result = append(result, v) count-- if count == 0 { delete(m, v) } else { m[v] = count } } } return result }
次は、交差アルゴリズムを使用した実際のケースです:
arr1 := []int{1, 2, 3, 4, 5} arr2 := []int{3, 4, 5, 6, 7} result := intersect_map(arr1, arr2) fmt.Println(result) // 输出:[3, 4, 5]
この例では、intersect_map
関数を使用して計算が行われます。 2 順序付けされた配列の共通部分。結果は result
変数に格納されます。
以上がGolang における配列交差の効率的なアルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。