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

配列内のK番目に大きい要素を求めるアルゴリズム

このアルゴリズムは、与えられたデータ集合の中から、配列の最大要素からK番目に大きい要素までを見つけ出すものです。

この問題は、配列をソートすることで簡単に解決できます。ソートは昇順・降順のどちらでも構いませんが、降順に並べ替えれば、先頭のK個の要素を取り出すだけで目的の結果が得られます。

入力と出力

入力:
配列の要素: {1, 23, 12, 9, 30, 2, 50, 63, 87, 12, 45, 21}, K = 4

出力:
4つの大きい要素: 87 63 50 45

アルゴリズム

kthLargestElement(array, n, k)

入力: 配列、配列の要素数 n、順位 k

出力: 最大要素からK番目に大きい要素までを表示する

擬似コード

Begin
    配列を降順にソートする
    for i := 0 to k-1, do
        array[i] を表示する
    done
End

C++による実装例

#include<iostream>
#include<algorithm>
using namespace std;

bool compare(int a, int b) {
    return a>b;
}

void kthLargestElement(int array[], int n, int k) {
    sort(array, array+n, compare);

    for (int i = 0; i < k; i++)     // 最大値からK番目に大きい要素まで表示
        cout << array[i] << " ";
}

int main() {
    int array[] = {1, 23, 12, 9, 30, 2, 50, 63, 87, 12, 45, 21};
    int n = 12;
    int k = 4;
    kthLargestElement(array, n, k);
}

実行結果

87 63 50 45

計算量の目安

この手法では、ソートに O(n log n)、上位K個の表示に O(K) の時間がかかるため、全体の時間計算量は O(n log n) となります。より効率的に求めたい場合は、優先度付きキュー(ヒープ)を活用する方法や、平均 O(n) で動作するクイックセレクトを採用するのも有効です。

  1. Pythonでストリーム内のK番目に大きい要素を求める方法

    本記事では、データストリームの中からK番目に大きい要素を求めるクラスをPythonで設計する方法を解説します。ここでの「K番目に大きい」とは、ソート順におけるK番目の位置にある要素を指し、重複を除いた「K番目に大きい値(distinct)」とは異なる点に注意してください。 問題の概要 KthLargest クラスは、整数 k と初期データを格納した配列 nums を受け取るコンストラクタを持ちます。その後、add(val) メソッドが呼び出されるたびに、新しい値をストリームに追加し、その時点でのK番目に大きい要素を返します。 動作例 例えば、k = 3、初期要素が [4, 5, 8, 2]

  2. Pythonで配列内のK番目に大きい要素を求める方法

    問題の概要ソートされていない配列が与えられたとき、その中からk番目に大きい要素を見つける必要があります。例えば、配列が [3,2,1,5,6,4] で k = 2 の場合、2番目に大きい要素は「5」なので、結果は5となります。解決のアプローチこの問題は、以下の手順で解決できます。まず、配列の要素を昇順にソートします。kが1の場合は、最大値(配列の末尾の要素)をそのまま返します。それ以外の場合は、array[n - k] を返します。ここで n は配列のサイズです。ソート後の配列は昇順に並んでいるため、末尾から数えてk番目の位置、つまりインデックス n-k の要素が求める「k番目に大きい要素」と