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

ブログ    
ブログ    
ブログ    

推薦する

...

アイウェア市場は1000億円規模を超えるか? 3Dプリントで「顔のカスタマイズ」を実現

私たちの日常生活には、近視用メガネ、サングラス、サングラス、遠視用メガネ、ゴーグルなど、視力矯正、視...

スタンフォード大学がAI法の講座を開設。人工知能は法律の対象になり得るか?

昨年3月、アリゾナ州でウーバーの自動運転車が歩行者をはねて死亡させた。米国の検察当局が「ウーバーに責...

AIと機械学習を活用して、誰にでも何でも販売する

AI と IBM Watson の Personality Insights を使用して見込み客に確...

研究により機械学習のバックドア問題が発見される

翻訳者 | 李睿校正:孫淑娟第三者が機械学習モデルを提供し、そこに悪意のあるバックドアを密かに埋め込...

AIコピーライティングの11のメリット

この記事では、AI がコピーライターにもたらす 11 のメリットの一部と、次のプロジェクトで AI ...

生体認証:デジタル時代への突入

生体認証とは、ある人物の特定の生物学的特徴に基づいてその人物を識別する技術の使用を指します。テクノロ...

マスク氏は、将来は人間よりもロボットの数が多くなると述べ、テスラは自動運転技術を共有する用意があると述べた。

7月6日、本日開幕した世界人工知能会議で、マスク氏は会議に直接出席しなかったものの、インターネット...

...

画像をデジタル化して特徴を抽出するための、事前トレーニング済みのディープラーニングモデル6つ

[51CTO.com クイック翻訳] ユビキタスセンサーは毎日大量の画像を収集しており、人工知能技術...

橋梁点検におけるUAV技術の応用

これらの技術の応用により、長期的にはドローンが開発され、橋梁点検の分野で応用されるでしょう。では、橋...

いくつかの最短経路アルゴリズムの比較

最短経路問題は、グラフ理論研究における古典的なアルゴリズム問題であり、グラフ(ノードとパスで構成され...

このアルゴリズムはアーキテクチャを自動的に最適化し、エンジニアがニューラルネットワークを設計するのに役立ちます。

最近、カナダのバンクーバーで NeurIPS 2019 が開催されました。テンセントAIラボからは合...

心でタイピング、中国で脳コンピューターインターフェースの新記録が樹立されました!

手やキーボードを使わず、思考だけに頼って、1分間に691.55ビットをコンピューター画面に出力できま...

テキスト認識と表認識、このライブラリは直接呼び出します

PaddleOCR は、PaddlePaddle ディープラーニング フレームワークに基づいて開発さ...