エントリーレベルのデータベースアルゴリズム [パート 3]

エントリーレベルのデータベースアルゴリズム [パート 3]

前回は著者の指示に従って、データ構造におけるクエリ アルゴリズムといくつかのソート アルゴリズムを確認しました。今回は著者の指示に従って、基本的なソート アルゴリズムをいくつか学習します。

選択ソート

使用条件:同等のサイズのコレクション。

アルゴリズムのアイデア:毎回、ソートするデータ要素から最小 (または最大) の要素を選択し、ソートするすべてのデータ要素がソートされるまで、ソートされたシーケンスの最後に配置します。

例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}

  1. //単純な選択ソート 
  2. voidシンプルセレクト( int b[10])
  3. {
  4.     整数温度;
  5.     整数i;
  6.      (i=0;i<9;i++)の場合
  7. {
  8.          ( int j=i+1;j<9;j++)の場合
  9. {
  10.             もし(b[i]>b[j])
  11. {
  12. temp = b [i];
  13. b[i] = b[j];
  14. b[j] = 一時;
  15. }
  16. }
  17. }
  18. cout<< "ソートは次のようになります:" ;
  19.      ( int i=0;i<10;i++ )の場合
  20. {
  21. cout<<b[i]<< " " ;
  22. }
  23. cout<<endl;
  24. }

パフォーマンス分析:時間計算量は O(n^2)


ヒープソート

使用条件:同等のサイズのコレクション。

アルゴリズムのアイデア:実際、ヒープ ソートは単純な選択ソートの進化形であり、その主な機能は比較回数を減らすことです。ヒープとは何ですか?シーケンスを完全な二分木と見なすと、完全な二分木内のすべての非終端ノードの値は、その左と右の子ノードの値よりも大きくありません(または小さくありません)。これをヒープと呼ぶことができます。ヒープの特性から、ヒープの最上部が最大キーワード (または最小キーワード) であることがわかります。ヒープの最上部を出力した後、残りの要素で別のヒープを構築し、最上部を出力します。この処理を繰り返し実行することで、順序付けられたシーケンスを取得できます。この処理はヒープソートと呼ばれます。

ヒープソートは主に 2 つのステップに分かれます。

  1. 順序付けられていないシーケンスからヒープを構築します。
  2. 最上位の要素を出力し、新しいヒープを作成します。

例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}

  1. //ヒープソート 
  2. voidヒープソート( int b[10])
  3. {
  4.      voidヒープ調整( int b[10], int min, int max);
  5.      void Sawp( int *a, int *b);
  6.     整数i;
  7.      //バイナリツリーが完成しているので、ヒープ変換は最後の非リーフノードから開始されます 
  8.      (i=9/2;i>=0;i--)の場合
  9. {
  10. ヒープ調整(b,i,9);
  11. }
  12.      //ヒープの一番上のデータを取り出して再度ソートする 
  13.      (i=9;i>0;i--)の場合
  14. {
  15. sawp(&b[i],&b[0]);
  16. ヒープ調整(b,0,i-1);
  17. }
  18. }
  19. //ヒープ調整(トップヒープが大きい)  
  20. //最小データは配列の開始位置を調整する必要がある 
  21. //最大データはデータの終了位置を調整する必要がある 
  22. voidヒープ調整( int b[10], int最小値, int最大値)
  23. {
  24.      (max<=min)の場合戻り値は;
  25.     整数温度;
  26. 温度=b[分];
  27.     整数j;
  28.      // 子ノードのループを拡張する 
  29.      (j=2*最小;j<=最大;j*=2)の場合
  30. {
  31.          //古い子を選択 
  32.          (j<max&&b[j]<b[j+1])の場合
  33. {
  34. j++;
  35. }
  36.          //スタックの先頭がそれより小さい子は処理されない 
  37.          (temp>b[j])の場合
  38. {
  39.             壊す;
  40. }
  41.          //大きい数字を小さい数字に置き換える 
  42. b[最小] = b[j];
  43. 最小値=j;
  44. }
  45. b[分]=温度;
  46. }
  47. //スワップ関数 
  48. void Sawp( int *a, int *b)
  49. {
  50.     整数温度;
  51. 温度=*a;
  52. *a=*b;
  53. *b=一時;
  54. }

パフォーマンス分析:時間計算量 時間計算量 O(nlogn)


マージアルゴリズムは2ウェイマージアルゴリズムとも呼ばれます

使用条件:同等のサイズのコレクション。

アルゴリズムのアイデア:初期シーケンスに n 個のレコードが含まれていると仮定すると、これは n 個の順序付けられたサブシーケンスと見なすことができます。各サブシーケンスの長さは 1 で、次に 2 つずつ結合して、長さが 2 または 1 の [n/2] 個のサブシーケンスを取得します (ここでは長さが 1 で、シーケンスの長さが奇数の場合は最後のシーケンスがそのまま残されるため、長さは 1 になります)。次に 2 つずつ結合し、長さ n の順序付けられたシーケンスが得られるまでこのプロセスを繰り返します。

例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}

  1. //マージソート 
  2. voidマージソート( int b[10], int d[10], int min, int max)
  3. {
  4.      //中央の領域から取得したシーケンスを使用して保存します 
  5.     整数c[10];
  6.      void Merge( int c[10], int d[10], int min, int mid, int max);
  7.      (min==max)d[min]=b[min]の場合;
  8.     それ以外 
  9. {
  10.          // 2つの領域に分割する 
  11.          int中間 = (最小 + 最大) / 2;
  12.          //このエリアをマージしてソートする 
  13. マージソート(b,c,min,mid);
  14.          //このエリアをマージしてソートする 
  15. マージソート(b,c,mid+1,max);
  16.          // 2つの領域を結合する 
  17. マージ(c,d,最小,中間,最大);
  18. }
  19. }
  20. //順序付けられたシーケンス d[min-mid] と d[mid+1-max] を順序付けられたシーケンス c[min-max] にマージします。  
  21. void Merge( int c[10], int d[10], int min, int mid, int max) をマージします。
  22. {
  23.     整数i,j,k;
  24.      (i=j=min,k=mid+1;j<=mid&&k<=max;i++)の場合
  25. {
  26.          (c[j]>c[k])の場合
  27. {
  28. d[i] = c[k];
  29. 関数
  30. }
  31.         それ以外 
  32. {
  33. d[i] = c[j];
  34. j++;
  35. }
  36. }
  37.      (j<=mid)の場合
  38. {
  39.          (;j<=mid;j++,i++)の場合
  40. {
  41. d[i] = c[j];
  42. }
  43. }
  44.      (k<=max)の場合
  45. {
  46.           (;k<=max;k++,i++)の場合
  47. {
  48. d[i] = c[k];
  49. }
  50. }
  51. }

パフォーマンス分析:時間計算量 O(nlogn)

要約する

さまざまなアプリケーションや要件に応じて適切なソート方法が異なるため、次の要素を考慮して適切なソート方法を選択してください。

  1. ソートするレコードの数 n
  2. 安定性の要件
  3. ストレージ構造
  4. 時間と補助空間の複雑さ

では、ソートアルゴリズムは数多くありますが、どのアルゴリズムをいつ使用すればよいのでしょうか?

n が比較的小さい場合 (たとえば、n<=50)、直接挿入ソートまたは単純選択ソートを使用できます。

シーケンスの初期状態が基本的に順序付けられている場合は、直接挿入ソートまたはバブルソートを選択できます。

n が比較的大きい場合は、時間計算量が O(nlogn) のアルゴリズム(クイックソート、ヒープソート、マージソート)を使用できます。

  1. クイックソートは現在、比較ベースの内部ソートに最適な方法と考えられています。ソートされたキーワードがランダムに分散されている場合、クイックソートの平均時間は最短になります。 不安定
  2. ヒープ ソートでは、クイック ソートよりも補助スペースが少なくて済み、クイック ソートで発生する可能性のある最悪のシナリオの影響を受けません。 しかし、まだ比較的不安定
  3. マージソートは比較的安定していますが、一般的に使用することは推奨されません。実用性が低く、大量の補助スペースを占有する可能性があります。

オリジナルリンク: http://www.cnblogs.com/couhujia/archive/2011/03/25/1994996.html

【編集者のおすすめ】

  1. データマイニングにおける10の古典的なアルゴリズムの予備的調査
  2. 現在世界で最も重要な古典的アルゴリズムトップ10
  3. 面接中にアルゴリズムの質問を解く際にプログラマーが知っておくべきこと
  4. 初級データベースアルゴリズム [I]
  5. エントリーレベルのデータベースアルゴリズム [パート 2]

<<:  非反復乱数列生成アルゴリズム

>>:  エントリーレベルのデータベースアルゴリズム [パート 2]

ブログ    

推薦する

強力な顔認識システムを騙すには、額に紙を貼り付けてください。 Huawei製、Face IDは終了

[[275013]]額にお守りを貼るとAIがあなたを認識できなくなるって知っていましたか?たとえば、...

MLP および Re-Parameter シリーズに関する人気の論文を含む、注目メカニズムの 17 個の PyTorch 実装

[[415286]]注意メカニズムは、最初はコンピューター ビジョンで使用され、その後 NLP の分...

...

警戒するのは困難:真剣な AI 研究がいかにしてコンピューター生成ポルノに変わったのか?

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

より優れた LLM ベースのアプリケーションを構築するための 4 つの秘訣

アドリアン・トゥルイユ翻訳者 | ブガッティ校正 | Chonglou制作:51CTO テクノロジー...

Transformer モデルを使用した時系列予測の Pytorch コード例

時系列予測は永続的なトピックです。自然言語処理の分野での成功に触発されて、トランスフォーマー モデル...

TensorFlow2を使用して細胞画像が感染しているかどうかを判断する方法を教えます

[[405128]]このチュートリアルでは、TensorFlow (Keras API) を使用して...

機械学習プロジェクトにおける特徴エンジニアリングの 5 つのベスト プラクティス

私たちは長年にわたり、機械学習プロジェクトで何が機能し、何が機能しないかを特定するために、さまざまな...

ビデオ会議に最適な AI アプリケーション

人工知能はさまざまな方法でビジネスを支援しています。 COVID-19パンデミックの間、多くの企業は...

アンサンブル法の簡単な分析

パーソナライズされた推奨システムは、金融、電子商取引、メディア、ライブ放送などの業界における Dag...

...

ローコード機械学習ツール

機械学習は、ビジネスや世界中のさまざまな問題の解決に役立つ可能性があります。通常、機械学習モデルを開...

実用的! Python の日付と時刻の処理と計算: 時間を節約し、正確に計算します

Python の datetime モジュールは、日付と時刻の処理と計算のための豊富な機能を提供しま...

ウルトラマンが解雇されるのは今回が初めてではない! YCを去った人物は「創設者から去るように言われた」

ウルトラマンニウフルが「追い出される」のは初めてではないでしょうか? ? !予想外にも、OpenAI...

自動運転の実用化にはまだいくつかのハードルがある

ここ数年、世界的な自動運転はまだ発展途上であったとすれば、各国の政策の推進により、自動運転に関する最...