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

C++でソートされていない配列における最大ペア和を求めるアルゴリズム

この記事では、N個のソートされていない要素からなる配列 arr[] が与えられたとき、その中で最も大きい合計値を持つペア(最大ペア和)を見つける方法を解説します。

つまり、配列内の2つの要素を選んだとき、その合計が最大となる組み合わせを求めるという問題です。

問題の例

具体的な入出力例を見てみましょう。

入力 : arr[] = {7, 3, 9, 12, 1}
出力 : 21

説明:

最大の合計を持つペアは (9, 12) であり、その合計は 9 + 12 = 21 となります。

解決アプローチ

この問題に対するシンプルかつ効率的な解法は、配列内の最大値と2番目に大きい値(次点の最大値)を組み合わせたペアを作ることです。

手順は以下の通りです。

  1. まず、配列の最初の要素と2番目の要素を比較し、大きい方を max、小さい方を secondMax として初期化します。
  2. 次に、インデックス2から (n-1) まで配列を走査し、各要素を max および secondMax と比較します。
  3. arr[i] が max より大きい場合、secondMax = max とし、max = arr[i] を代入します。
  4. arr[i] が secondMax より大きい場合(ただし max とは異なる値)、secondMax = arr[i] を代入します。
  5. ループが終了したら、(max + secondMax) を返します。

この手法により、配列を一度走査するだけ(O(N) の時間計算量)で答えを求められるため、ソートを行う O(N log N) の方法よりも効率的です。

C++実装例

以下は、この解法の動作を示すC++プログラムです。

#include<iostream>
using namespace std;
int findPairLargestSum(int arr[], int n){
    int max, secondMax;
    if (arr[0] > arr[1]){
        max = arr[0];
        secondMax = arr[1];
    }
    else{
        max = arr[1];
        secondMax = arr[0];
    }
    for (int i = 2; i<n; i ++){
        if (arr[i] > max){
            secondMax = max;
            max = arr[i];
        }
        else if (arr[i] > secondMax && arr[i] != max)
            secondMax = arr[i];
    }
    return (max + secondMax);
}
int main(){
    int arr[] = {12, 34, 10, 6, 40};
    int n = sizeof(arr)/sizeof(arr[0]);
    cout<<"最大ペア和の合計値は "<<findPairLargestSum(arr, n);
    return 0;
}

実行結果

最大ペア和の合計値は 74

この例では、配列 {12, 34, 10, 6, 40} の中で最大値 40 と2番目に大きい値 34 を組み合わせたペアが最大となり、合計は 40 + 34 = 74 となります。

まとめ

ソートされていない配列で最大ペア和を求めるには、配列をソートする必要はありません。最大値と次点の最大値を1回の走査で追跡するだけで、時間計算量 O(N)、空間計算量 O(1) で効率よく解くことができます。データ数が多い場合でも高速に動作するため、実務においても有用なアルゴリズムです。

  1. C++で二分木における最大部分木の合計を求める方法

    この問題では、二分木(バイナリツリー)が与えられます。私たちのタスクは、木の中で最も大きな合計値を持つ部分木を見つけることです。 問題の概要 二分木には正の値と負の値が混在しています。その中から、ノードの合計が最大になる部分木を特定する必要があります。 例で問題を理解しよう 出力: 13 説明: 左部分木の合計:7 右部分木の合計:1 木全体の合計:13 このように、根を含む木全体の合計である「13」が最大の部分木の合計となります。 解法のアプローチ この問題を解くためには、後順走査(ポストオーダー走査)を利用します。手順は以下の通りです。 左部分木と右部分木それぞれのノードの合計を再

  2. C++で配列の最大要素とその位置を見つける方法

    配列の最大要素とは配列には複数の要素が格納されており、その中で他のすべての要素よりも大きい値を持つものが「最大要素」です。具体例51724上記の配列の場合、最大要素は7であり、インデックス2の位置に存在します。それでは、配列の最大要素を求めるC++プログラムを見ていきましょう。サンプルコード#include <iostream> using namespace std; int main() { int a[] = {4, 9, 1, 3, 8}; int largest, i, pos; largest = a[0]; for(i=1; i<