古典的なアルゴリズム: 順序付けられていない配列の 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がコロナホールを発見し宇宙天気予報を自動化

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

食品市場における産業用ロボット、2026年までに7億4500万米ドルに達すると予想

[[433247]]包装食品の需要増加により、食品ロボット市場規模の成長が促進されると予想されます。...

父親が8歳の娘にディープラーニングを説明する:11の事実

「ニューラル ネットワークは数を数えるのと同じくらい簡単です」、「畳み込み層は単なるバット シグナル...

DeepMindは大規模なモデルで帰納法と演繹法を学習できるようにし、GPT-4の精度は13.7%向上した。

現在、大規模言語モデル (LLM) は、特にいくつかの例と中間ステップが与えられた場合に、推論タスク...

...

研究結果:人工知能はパンデミック後にさらに普及するだろう

人工知能と機械学習は当初は懐疑的な見方に直面していたかもしれないが、新たな報告書によると、パンデミッ...

人工知能開発における5つの制約問題、数千の問題を解決する5つの解決策

[[237095]]人工知能はどこにでもあるようです。私たちはそれを自宅や携帯電話で体験します。起業...

アクセス制御における生体認証の応用と開発

現在、アクセス制御にはより高度な技術と新しいアプリケーション市場があります。アクセス制御システムで現...

2021年に自動運転は私たちをどこへ連れて行くのでしょうか?

[[361430]]文/Quiu Yueye 編集/Tan Lu新年、自動運転は私たちをどこへ連れ...

...

注目メカニズムに基づく人工知能アルゴリズム単一画像超解像法は、質感と滑らかさを区別します

人工知能アルゴリズムによる注目ベースの単一画像超解像法は、テクスチャと滑らかさを区別します。概要: ...

[詳細] 人工知能の生涯を10分で読む

AIは2016年以来最もホットなキーワードであり、それについてはさまざまな意見があります。バブルがは...

WeChat OCR(2):ディープシーケンス学習がテキスト認識を助ける

この記事は、WeChat OCR 技術紹介シリーズの一部であり、ディープ シーケンス ラーニング手法...

OpenAI 開発者会議: OpenAI が AI 分野で再び波を起こす方法

AI業界の実務家にとっては、眠れない夜を過ごしたかもしれない。北京時間11月7日早朝、アメリカの人工...