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

C++で配列内の2つの数値間の最小距離を求める方法

はじめに

ソートされていない配列Aと、2つの数値x・yが与えられたとき、配列内におけるxとyの最小距離(インデックスの差)を求める問題を考えてみましょう。なお、配列には重複した要素が含まれている場合もあります。

例えば、配列が A = [2, 5, 3, 5, 4, 4, 2, 3]、x = 3、y = 2 である場合、3と2の間の最小距離は 1 となります。

解法のアプローチ

この問題は、配列を一度だけ走査することでO(n)の計算量で解くことができます。手順は以下の通りです。

  • 配列を左から右へ走査し、xまたはyのいずれかが見つかった時点で停止します。その位置のインデックスを prev として保存します。
  • 続いて、インデックス prev 以降の要素を引き続き走査します。現在のインデックス i の要素がxまたはyのいずれかに一致した場合、それが A[prev] と異なる値かどうかを確認します。異なる値であれば、必要に応じて最小距離を更新し、prev を i に更新します。同じ値であった場合も、prev を i に更新して次へ進みます。

この方法により、各要素を一度ずつ確認するだけで最小距離を求められるため、時間計算量はO(n)、追加のメモリ使用量はO(1)と非常に効率的です。

C++での実装例

#include<iostream>
using namespace std;
int findMinDistance(int A[], int n, int x, int y) {
    int i = 0;
    int distance = INT_MAX;
    int prev_index;
    for (i = 0; i < n; i++) {
        if (A[i] == x || A[i] == y) {
            prev_index = i;
            break;
        }
    }
    while (i < n) {
        if (A[i] == x || A[i] == y) {
            if ( A[prev_index] != A[i] && (i - prev_index) < distance ){
                distance = i - prev_index;
                prev_index = i;
            } else
                prev_index = i;
        }
        i++;
    }
    return distance;
}
int main() {
    int arr[] = {2, 5, 3, 5, 4, 4, 2, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 3;
    int y = 2;
    cout << "Minimum distance between " << x << " and " << y << " is: "<< findMinDistance(arr, n, x, y);
}

出力結果

Minimum distance between 3 and 2 is: 1

まとめ

このアルゴリズムでは、最初にxまたはyのいずれかが出現する位置を記録し、その後に出現するもう一方の値との距離を順次比較することで最小距離を求めています。重複要素が含まれる配列でも正しく動作し、線形時間で処理が完了するため、大規模なデータに対しても実用的な手法です。

  1. 二分木の2つのノード間の距離を求めるクエリ – C++でのO(log n)手法

    この問題では、二分木とQ個のクエリが与えられます。私たちのタスクは、C++でO(log n)の計算量を使って、二分木の2つのノード間の距離を求めるプログラムを作成することです。問題の概要各クエリでは、二分木の2つのノードが与えられ、その2つのノード間の距離を求める必要があります。ここでの「距離」とは、一方のノードからもう一方のノードに到達するために通過する必要がある辺(エッジ)の数を意味します。具体例を見て問題を理解しましょう。入力:二分木クエリ数 = 3 [2, 6] [4, 1] [5, 3]出力:3, 2, 3解決アプローチこの問題を解くには、最小共通祖先(LCA:Lowest Comm

  2. C++で二分木の2つのノード間の距離を求める方法

    問題の概要いくつかのノードを持つ二分木が与えられているとします。このとき、2つのノード u と v の間の「距離」、つまり一方のノードからもう一方のノードへ移動する際に通る辺(エッジ)の本数を求めることを考えます。例として、次のような二分木を扱います。 1 / \ 2 3 / \ / \ 4 5 6 7 \ 8この木において、ノード (4, 6) 間の距離は 4(経路:4 → 2 → 1 → 3 → 6)、ノード (5, 8) 間の