エントリーレベルのデータベースアルゴリズム [パート 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]

ブログ    
ブログ    

推薦する

2030 年の AI はどのようになっているでしょうか?専門家が10の予測を発表

2020 年も終わりに近づいていますが、AI はさまざまなことに役立っています。車を運転したり、音楽...

ハイパーオートメーションの旅を始めましょう: 仕事のやり方を変え、運用プロセスを簡素化しましょう

最近の調査によると、より複雑な作業をインテリジェントな自動化に任せることを計画している企業の数は、今...

...

世界初!人間の脳のようなスーパーコンピュータ「シェナン」がまもなく発売され、ムーアの法則を破り、エネルギー消費を数桁削減する

人間の脳は地球上で最も効率的な計算装置です。わずか 20W の電力と 1.3kg の質量で、1 秒間...

OpenAI とオープンソースの多言語埋め込みモデル、どちらを選びますか?

翻訳者 | 朱 仙中レビュー | Chonglou制作:51CTO テクノロジースタック(WeCha...

ゲームオーバー?強いAIと弱いAIの戦い

数週間前、Googleの人工知能(AI)子会社DeepMindが、Gato(同じトレーニング済みモデ...

F1カーがハッキングされた、人工知能技術が救世主となるのか?

それは1998年、オーストラリアF1グランプリの時のことでした。 36周目にフィンランド人ドライバー...

シンプルで効率的なアルゴリズムが衛星IoTを現実に近づける

背景モノのインターネット (IoT) の継続的な発展は、ここ数年にわたって現実のものとなってきました...

6種類の負荷分散アルゴリズムの概要

C言語を学んだ友人やIT関係の人ならアルゴリズムには詳しいと思います。したがって、分野が異なれば、ア...

プログラミング啓蒙ロボット、本物の人形か、それとも本当の物語か?

[[255856]]画像ソース @Visual China人工知能の普及により、中国の親たちの不安...

大規模な伝染病に直面した時、ロボットは何ができるでしょうか?

ウイルスのさらなる拡散を防ぐため、米国で初めて新型肺炎に感染した患者は隔離室に隔離され、治療中はロボ...

人工知能は現代のテクノロジー業界をさまざまな形で変えている

AIは現代のビジネスとテクノロジーのエコシステムをさまざまな形で大きく変えてきました。過去数年間に...

RPAは人工知能の究極の発展方向でしょうか?

ロボティック・プロセス・オートメーション (RPA) は、単調で反復的なタスクを排除するのでしょうか...

「機械学習」CNNを徹底理解

[[212238]]前世紀、科学者は視覚神経のいくつかの特性を発見しました。視神経には局所的な知覚が...