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

ブログ    
ブログ    

推薦する

AI を使って「手を洗ってください」を 500 の言語に翻訳する方法

[[322940]]人間による翻訳と機械による翻訳の両方を使用することで、健康に関する重要なフレーズ...

OpenAI のセキュリティ脆弱性が明らかに: ChatGPT の制限は一般的でない言語を使用することで簡単に回避可能

10月12日、ブラウン大学のコンピューターサイエンス研究者は、OpenAIのGPT-4セキュリティ設...

AIと合成生物学の融合における5つの大きな課題:テクノロジー、データ、アルゴリズム、評価、社会学

過去 20 年間で生物学は大きな変化を遂げ、生物システムを設計することが可能になりました。私たちの細...

HKU がオープンソースの推奨システムの新しいパラダイム RLMRec を公開!ユーザー/製品のテキストポートレートを正確に抽出するための大規模なモデルサポート

レコメンデーション システムは、ディープラーニングとグラフ ニューラル ネットワークの影響を受けて大...

...

AIの冬が来ます!ディープラーニングはスケールしません...

著者について: Filip Piekniewski は、コンピューター ビジョンと AI の専門家で...

...

低迷期を経て復活を遂げ、人工知能の波が押し寄せている!

[51CTO.comより引用] 近年、コンピュータ技術は急速に発展しており、人工知能はその操作性と...

FFH—AI 詩作 HttpRequest 練習

オープンソースの詳細については、以下をご覧ください。 51CTO オープンソース基本ソフトウェアコミ...

我が国のドローン産業の発展の現状と課題の分析

[[422841]]ドローンは我が国の現在の戦略的新興産業の一つであり、近年、技術、製品、アプリケー...

ディープフェイクで映画を作る時代が来た:ディズニーが高解像度の顔を変えるアルゴリズムを公開

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

...

現在、CIOは企業におけるGenAIの応用価値を慎重に検討している。

ほとんどの CIO は、自社のビジネスがテクノロジーのトレンドに追いつくために GenAI の検討を...

産業AI戦略を成功させる3つの鍵

今日、工業製造業は産業用人工知能への依存度が高まっており、業務上の意思決定者はこれをデジタル変革戦略...