Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで重複する配列から欠落要素を見つける方法【二分探索で効率化】

問題の概要

互いに重複関係にある2つの配列が与えられますが、そのうち片方の配列には1つだけ要素が欠けています。この欠落している要素を見つけるのが本記事の課題です。

例えば、入力が A = [2, 5, 6, 8, 10]B = [5, 6, 8, 10] の場合、2番目の配列には「2」が含まれていないため、出力は 2 となります。

解決のアプローチ

この問題は、二分探索(バイナリサーチ)を活用することで、O(log N) の時間計算量で効率的に解くことができます。なお、この手法は両方の配列が昇順にソートされていることを前提としています。手順は以下の通りです。

  1. solve() 関数を定義します。引数として A、B、N を受け取ります。

  2. N が 1 の場合、A[0] を返します。

  3. A[0] と B[0] が等しくない場合、A[0] を返します。

  4. low := 0、high := N - 1 と初期化します。

  5. low < high の間、以下を繰り返します。

    • mid := (low + high) / 2 を計算します。

    • A[mid] と B[mid] が等しい場合、low := mid とします。

    • そうでなければ、high := mid とします。

    • low が high - 1 と等しくなったら、ループを抜けます。

  6. A[high] を返します。

  7. メイン処理では以下を行います。

  8. M := A のサイズ、N := B のサイズ とします。

  9. N が M - 1 と等しい場合、solve(A, B, M) を返します。

  10. M が N - 1 と等しい場合、solve(B, A, N) を返します。

  11. それ以外の場合、「Not found」を返します。

実装例

理解を深めるために、以下のPythonコードをご覧ください。

def solve(A, B, N):
    if N == 1:
        return A[0]
    if A[0] != B[0]:
        return A[0]
    low = 0
    high = N - 1
    while (low < high):
        mid = (low + high) // 2
        if A[mid] == B[mid]:
            low = mid
        else:
            high = mid
        if low == high - 1:
            break
    return A[high]

def get_missing_element(A, B):
    M = len(A)
    N = len(B)
    if N == M - 1:
        return solve(A, B, M)
    elif M == N - 1:
        return solve(B, A, N)
    else:
        return "Not found"

A = [2, 5, 6, 8, 10]
B = [5, 6, 8, 10]
print(get_missing_element(A, B))

入力

[2, 5, 6, 8, 10], [5, 6, 8, 10]

出力

2

まとめ

この記事では、ソート済みの2つの配列から欠落している要素を二分探索で見つける方法を解説しました。先頭や末尾の不一致を早期に判定しつつ、中央値の比較を繰り返すことで、線形探索の O(N) に対して O(log N) まで計算量を削減できる点が大きなメリットです。大量のデータを扱う場面で特に有効なテクニックなので、ぜひ実際のコードで試してみてください。

  1. Pythonで配列内の最大の要素を見つける方法を解説

    この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を

  2. Pythonで配列内の最大要素を見つける方法【初心者向け解説】

    本記事では、配列の中から最大の要素を見つけるための解法とアプローチについて詳しく解説します。 問題の概要 配列が入力として与えられたとき、その中から最も大きい要素を見つけ出すことが課題となります。 アプローチ この問題は「線形探索」と呼ばれるシンプルな手法で解決できます。手順は以下の通りです。 まず、変数 max を配列の最初の要素で初期化します。 次に、2番目の要素から配列の末尾まで順番に走査していきます。 走査中の各要素について、現在の max の値と比較します。 要素が max より大きければ、max の値をその要素で更新します。 そうでなければ、そのまま次の要素へ進みます。 この処