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

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

推薦する

...

...

顔認識アクセス制御システムの登場により、私たちのプライバシーを誰が守るのでしょうか?

最近は「顔カード」、つまり「顔を売る」という言葉をよく耳にしますが、あなたの「顔」が身分証明書や電話...

転移学習におけるドメイン適応の理解と3つの手法の紹介

ドメイン適応はコンピューター ビジョンの領域であり、ソース データセットでニューラル ネットワークを...

Google: パフォーマンスの低い微調整モデルを捨てず、平均重量を計算してパフォーマンスを向上させる

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

人工知能とビッグデータの完璧な組み合わせ

人工知能(AI)は数十年前から存在しています。しかし、最近では「ビッグデータ」の登場により注目が高ま...

学覇君主任科学者陳瑞峰:テクノロジーを活用して知識のサイロ化を減らし、教育の効率化を実現する

[51CTO.comからのオリジナル記事] 学習圧力が高く、教育資源の配分が不均衡な中国の教育システ...

...

OpenAIの科学者による最新の大規模言語モデルのスピーチが話題となり、LLMの成功の鍵が明らかになった。

最近、OpenAIの研究科学者ヒョン・ウォン・チョン氏がソウル国立大学で「大規模言語モデル(2023...

AI イニシアチブを成功させるために必要な 10 のこと

市場で競争上の優位性を獲得する過程で、多くの企業が新興技術の導入に熱心です。しかし、導入を急ぐあまり...

Python による画像前処理の完全ガイド

機械学習やコンピューター ビジョンのプロジェクトで、画像の品質が低いという問題に遭遇したことはありま...

猫とチャットできるようになりました!生成型AIがもたらす包括的な革命:5年以内に初の動物言語を解読

ソロモンが動物とコミュニケーションをとることができたのは、魔法のアイテムを持っていたからではなく、観...

...