古典的なアルゴリズム: 順序付けられていない配列の K 番目に大きい値を見つける

古典的なアルゴリズム: 順序付けられていない配列の K 番目に大きい値を見つける

[[409182]]

1. K番目に大きいものを見つける

タイトル

順序付けられていない整数配列があります。ソートの考え方に基づいて、配列内の K 番目に大きい数値を見つけてください。

整数配列 a が与えられた場合、K 番目 (1<=K<=n) の最大の数値 (重複要素を含むが、重複を削除する必要はない) を返し、答えが存在することを確認します。

  1. [3, 2, 1, 5, 6, 4] 、2を入力
  2. 戻り値5

2. 従来の考え方

まず順序付けられていない配列をソートし、次に順序付けられた配列を検索します。

どのソートアルゴリズムを選択するかは、まだ決まっていません。

まず、さまざまなソートアルゴリズムの複雑さと安定性を見てみましょう。

上記の比較を読んだ後、あなたはすでに自分の答えを頭の中で持っているかもしれません。

3. 問題解決のアイデア

従来の考え方には 2 つのステップが必要です。

  1. まず全体を並べ替える
  2. 注文の目標値を見つける

それで、この質問では、ソート処理中に目標値を決定できるのでしょうか?

クイックソートのバイナリ特性を考慮してください。

  1. まず、左側がそれ自体より小さく、右側がそれ自体より大きい値の位置を見つけます(配列全体が2つに分割されます)
  2. 次に、配列全体が整うまで、左側と右側の部分でそれぞれ手順 1 を繰り返します。

ここで知っておく必要があるのは、クイックソートでは、左側の値がそれ自体よりも小さく、右側の値がそれ自体よりも大きいということです。この値の位置は、最終的な順序付けられた配列内の位置であり、検索中にターゲットの位置を決定できることを意味します。さらに、この問題を処理する過程では、平均してデータ量の半分だけが処理されます。


アニメーション - クイックソートアルゴリズム

クイックソートアルゴリズムの検索プロセス:

4. Goコードの実装

  1. func findKLargest(arr [] int , k int ) int {
  2. len(arr) == 0 || k > len(arr) の場合 {
  3. -1を返す
  4. }
  5.  
  6. var find func(k int , l, r int ) int  
  7. find = func(k int , l, r int ) int {
  8. /*
  9. // 通常のクイックソートには次のコードが必要です
  10. l >= r の場合 {
  11. 戻る 
  12. }
  13. // しかし、ここでは必要ありません。k番目に大きいデータを探す場合、通常はl==rです。
  14. */
  15. ll := l
  16. rr := r
  17. ターゲット := arr[l]
  18.  
  19. // 逆順(K番目によく使われる)は target >= arr[r] / target <= arr[l] です
  20. // 正の順序(k番目に使用頻度が低い)は target <= arr[r] / target >= arr[l] です
  21. l < r {の場合
  22. l < r && ターゲット >= arr[r] {
  23. r --  
  24. }
  25. arr[l] = arr[r]
  26.  
  27. l < r && ターゲット <= arr[l] {
  28. l++
  29. }
  30. arr[r] = arr[l]
  31. }
  32.        
  33. arr[l] = ターゲット
  34. // k は l の右側にあります
  35. // 次のコードでは、左側でも右側でも、最初のパラメーターが k なのはなぜですか?
  36. // k は検索する値の添え字位置を参照するため (k 番目に大きい値は添え字 k-1 になります)
  37. // 配列 arr の左側または右側に関係なく、対応する添え字は固定です
  38. // l/r は毎回変わるので、k はここで固定されます
  39. k > l の場合 {
  40. // ここでl+1、rrは配列の添え字でもある
  41. find(k, l+1, rr)を返す
  42. }そうでなければk<l{
  43. // k は l の左側にあります
  44. // ここでもll、l-1は配列の添え字です
  45. find(k, ll, l-1)を返す
  46. }
  47.  
  48. // この時点で、位置lのターゲットはk番目に大きい値です
  49. リターンターゲット
  50. }
  51.  
  52. // ソート後の k 番目に大きい値は配列インデックス k-1 です
  53. 見つける:= find(k-1, 0, len(arr)-1)
  54.  
  55. リターン検索
  56. }

K 番目に大きい数値を見つけるには、配列をソートします。

最小の K を見つけるには、配列を昇順に並べます。

いずれにせよ、最初から始める方が簡単です。

<<:  GitHub Copilot の盗作が確認されました! GitHub: 私たちの AI はコードを「暗唱」しません

>>:  AIがコロナホールを発見し宇宙天気予報を自動化

ブログ    

推薦する

WOT2018 Xian Yunsen: O2O検索にはアルゴリズムがあふれている

[51CTO.com からのオリジナル記事] 7 年間の努力と見事な変貌。 2012年以降、6年連続...

何も知らない状態から、3分で「ナレッジグラフ」を素早く理解するまで

[51CTO.com からのオリジナル記事] ナレッジ グラフは、インテリジェント マシンの脳を解き...

AI を活用したハイパーオートメーションがビジネス効率を向上させる方法

AI とハイパーオートメーションに期待するのには十分な理由があります。AI には、人間の思考や関連す...

...

Claude3はマイクロソフトとOpenAIに警鐘を鳴らした

編纂者 | Yan Zheng制作:51CTO テクノロジースタック(WeChat ID:blog)...

...

AIファースト戦略への移行に向けた5つのポイント

多くの企業が人工知能(AI)ファーストの戦略を目指しており、ビジネスプロセスの最適化に加えて、ビジネ...

新たな美容問題:彼女がAIではないことをどうやって証明するか

私の家族の皆さん、人間として生きることが昨今こんなにも困難になっているとは誰が想像したでしょうか?最...

企業がより持続可能な推論を通じてより環境に優しい AIGC を実現する方法

モデルとは何か一般人にとって、AIとそのプログラミングの基盤となるアルゴリズムが、これほど広範囲にわ...

...

...

...

ガベージクリーニングは必須 - Java ガベージコレクションアルゴリズム

1. Javaガベージコレクションアルゴリズムの核となる考え方Java 言語は、使用中のオブジェクト...

機械学習業界の発展はなぜ「オープンソース」から切り離せないのか

[[187490]] 2016 年末、Google DeepMind は機械学習プラットフォームであ...