BFPRT アルゴリズム - 配列内で K 番目に小さい要素を見つけます。

1. 実験問題の簡単な説明と分析

  1. 実験的な質問:

配列内で K 番目に小さい要素を見つけます。

  1. 問題例

通常、多数の数字の中から上位 K 個の数字を見つける必要があります。たとえば、検索エンジンでは、その日にユーザーがクリックした上位 1,000 個のホット ワードを見つけます。テキスト機能の選択では、次からランク付けされた上位 K 個の単語を見つけます。大対小問題。この問題はTOP-K問題とも呼ばれます。

  1. 従来のアルゴリズムの問​​題点:

従来のアルゴリズムとは、クイック ソート アルゴリズムを使用したソートを指します。クイック ソートの平均時間計算量は O(nlogn) ですが、時間計算量が O(n²) になる場合もあります。実際には、最初の K 個の大小の数値のみがソートされます。が必要な場合、他の冗長な数値を並べ替える必要はなく、クイック ソート アルゴリズムにより冗長な並べ替え時間が無駄になります。

  • 実験プロセスと時間計算量解析の簡単な説明

1.BFPTRアルゴリズム

BFPTR アルゴリズムは、メディアン アルゴリズムとも呼ばれます。アルゴリズム分析によると、最悪の時間計算量はわずかO(n)です。従来の方法 (つまり、クイック ソート アルゴリズム) との違いは、選択された並べ替えのみです。従来のアルゴリズムではソート番号の選択はランダムですが、BFPRT アルゴリズムでは、まず配列を隣接する 5 つのグループに分割し、残りが 5 つ未満の場合は、グループの場合は、各グループの中央値を含む新しい配列を作成し、選択した比較番号として新しい配列の中央値を取得します。再帰的に解いて、毎回の比較番号が確実に一致するようにします。を配列の中央に配置し、最終的に時間計算量を O(n) に削減します。

  1. 実験手順の簡単な説明

①元の配列をグループ化して5つのグループに分け、最終的に残りが5つ未満になった場合もグループとして数えます。

②得られた各グループを内部でソートし、中央値をとり、新しい配列に格納します。

③新しい配列の中央値を求め、この数値を比較番号 m* として分割処理を行いますつまり、m* より小さい数を S1 に格納し、m* より大きい数を S2 に格納します。

④ 判定状況 1: このとき k が |m*| と全く等しい場合、出力

判定状況2:このとき k>|m*| の場合、再帰 BFPRT( a , low , m.position-1 , int  key )を短くする

判定状況 3: このとき k<|m*| の場合、再帰 BFPRT( a , m.position+1 , high ,  int  key )を短くする

 図1 BFPRTアルゴリズムの概略図

  1. アルゴリズムの時間計算量解析

BFPRT アルゴリズムの最悪の時間計算量は O(n) です。T(n) を時間計算量とすると、次の式が簡単に得られます。

                                               (1)

                                                              ② ③

このうち、①はグループ内の中央値を求めることから来ており、②はBFPRT()の処理から来ており、最初に選択されたm*はまず中央値配列の1/2より大きい、つまり(1/2)*(全体の n/5) であり、n/10 個のうち、元の 5 つのグループの 3 個以上でなければならないため、最悪の場合、③c*n のたびに 7/10 個の部分が選択されることになります。ソートなどの他のプロセスから得られます。

  1. 実験的課題と新たな試みについての考え

アルゴリズムの説明では配列をグループ化するために5を使用しましたが、他の数値を使用してグループ化するのはどうなのでしょうか。実験ではプログラムを使用して比較してみました。

グループ化しても中央値を取るのに不便なので考慮しませんが、実験では元の配列をグループ化するために79を選択しましたが、配列の長さが同じ場合、5でグループ化した方が計算時間が短くなることがわかりました。一般に、 7 、 9 のグループ化の場合よりも優れています。

理由を分析します。

  1. まず、各グループの要素が増えるほど、データの最悪のケースが悪化します。たとえば、7 つのグループの場合、最悪のデータは 4:10 または 2:5 で分割され、これは 3 の比率よりも高くなります。 :7、そしてそれはさらに悪いです。
  2. これにより、再帰の回数が増加します。

以下の図は、200 ポイントの場合の 5、7、9 のグループ化に対する BFPRT アルゴリズムの結果を示しています。

 5グループ

7グループ

  9グループ

比較すると、一般に 5 グループ アルゴリズムの計算時間効率が最も高く、実行時間も速いことがわかります。

以下の図は、500 点の場合に 5、7、9 をグループ化した BFPRT アルゴリズムの結果を示しています

5グループ

7グループ

9グループ

同様に、比較すると、一般に 5 グループ アルゴリズムの計算時間効率が最も高く、実行時間も速いことがわかります。

おすすめ

転載: blog.csdn.net/qq_52913088/article/details/127010629