基本的なプログラミングアルゴリズムを簡単にマスターする(パート2)

基本的なプログラミングアルゴリズムを簡単にマスターする(パート2)

[[121970]]

この記事を書く前に、プログラマーの基本的な知識についてお話ししたいと思います。多くの人が自分の仕事の経験について話したり、卒業生にアドバイスをしたりしています。学生は学校でしっかりとしたコンピューターの基礎を築くべきだという彼らの提案に、著者は同意します。しっかりした基礎がなければ、どうやって建物を建てることができるでしょうか?ある程度の基礎知識があれば、深い理論を学ぶのは2倍簡単になります。最初に深い理論に触れてから関連する基礎を学べば、労力は半分で結果は2倍になります。おそらく多くの学生は、今はすぐにでも仕事を始められる人材を採用する企業が多いと言うでしょう。著者がまず言いたいのは、そのような企業は近視眼的な小さな企業に違いないということです。採用しても、非常に優秀な人材を見つけることはできません。たとえそこに行ったとしても、そのような人材は長く留まらないでしょう。なぜなら、そのような企業には発展のビジョンがなく、技術系の人材は発展の見込みがないため転職してしまう可能性があるからです。次に、コンピュータの基礎知識がしっかりしていれば、3 か月以内に会社の技術要件を満たすように学習し、適応できると信じています。

実際、著者が言いたいのは、基本を決して無視してはいけないということです。これ以上長々とせずに、基本的なソートアルゴリズムに直接進みましょう。

基本的なプログラミングアルゴリズム(I)

基本的なプログラミングアルゴリズム(II)

基本的なプログラミングアルゴリズム(III)

バブルソート

使用条件: コレクションの要素はサイズを比較できます

アルゴリズムのアイデア: ソートするレコードを継続的にスキャンします。スキャンするたびに、最小のレコードが見つかり、それが一番上に近づきます。各スキャンではレコードが最終的な最も正しい位置に配置されるため、次のスキャンではレコードを再確認する必要がありません。

プログラミング例: int b[10]={77,1,65,13,​​81,93,10,5,23,17} はバブルソートされます (ここで概念を混同していました。指摘してくれた zdd に感謝します)

  1. //バブルソート 
  2. voidバブル( int b[10])
  3. {
  4. 整数温度;
  5. 整数i;
  6. (i=9;i>0;i--)の場合
  7. {
  8. ( int j=0;j<i;j++)の場合
  9. {
  10. (b[j]>b[j+1])の場合
  11. {
  12. temp = b[j];
  13. b[j] = b[j+1];
  14. b[j+1] = 一時;
  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)

シェルソート

使用条件: コレクションの要素はサイズを比較できます

アルゴリズムのアイデア: まず、ソートするレコードのシーケンス全体をいくつかのサブシーケンスに分割し、それぞれに対して直接挿入ソートを実行します。シーケンス全体のレコードが「基本的に順序付けられている」場合は、すべてのレコードに対して直接挿入ソートを実行します。 サブシーケンスは単に「セグメントに分割」されるのではなく、特定の「増分」で区切られたレコードによってサブシーケンスが形成されます。そのため、比較して並べ替えるときに、キーワードが小さいレコードは段階的に前に進むのではなく、一定の増分で移動します。「増分」は減少傾向を示し、最終的にこの「増分」は常に 1 になります。このとき、シーケンスは基本的に順序付けられており、並べ替えを完了するために必要な比較と移動はわずかです。シェルソートの増分設定がわかりにくい。一般的に、8 つの数字の「増分」を 4、2、1 に設定することを検討します。 (これはシェルソートの一般的な設定です)。次に、「増分」h(n+1)=3*h(n)+1 を計算する式を作成します (h>N/9 で停止)。この式は増分には最適ではないかもしれませんが、一般的な「増分」設定には適用できます。数字が 8 個ある場合、ここでの増分は 1 です。

プログラミング例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}はシェルをソートする

  1. //ヒルソートの自動増分は自分で選択する必要があります 
  2. voidシェルソート( int b[10])
  3. {
  4. 整数h,i;
  5. 整数n=10;
  6. //このループを通して、1と4への増分を計算します 
  7. (h=1;h<=n/9;h=3*h+1)の場合
  8.  
  9. //インクリメントループ 
  10. (;h>0;h/=3)の場合
  11. {
  12. (i=h;i<n;i++)の場合
  13. {
  14. 整数j、温度;
  15. temp = b [i];
  16. // ソートを挿入 
  17. (j=ih;j>=0;j=jh)の場合
  18. {
  19. (b[j]>temp)の場合
  20. {
  21. b[j+h]=b[j];
  22. }
  23. それ以外 
  24. {
  25. 壊す;
  26. }
  27. }
  28. b[j+h]=温度;
  29. }
  30. }
  31. cout<< "ソートは次のようになります:" ;
  32. ( int i=0;i<10;i++ )の場合
  33. {
  34. cout<<b[i]<< " " ;
  35. }
  36. cout<<endl;
  37. }

パフォーマンス分析: ヒルソートの時間計算量は少々複雑です。特定の「増分」に応じて変化します。ここでは、著者は Yan Weimin の「データ構造」から O(n^3/2) を使用しています。

クイックソート

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

アルゴリズムのアイデア: ソート パスを通じて、ソートするレコードは 2 つの独立した部分に分割されます。レコードの一方の部分のキーワードがもう一方の部分のキーワードよりも小さい場合、レコードの 2 つの部分を別々にソートして、最終的に順序付けられたシーケンスに到達できます。ここで重要なポイントは、セグメンテーションの「ベンチマーク」を選択することです。この「ベンチマーク」より大きい場合は 1 つの部分に分割し、この「ベンチマーク」より小さい場合は 1 つの部分に分割する必要があります。ここで、著者はデフォルトでこの部分の最初のレコードを「ベンチマーク」として使用します。

プログラミング例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}

  1. //クイックソート 
  2. voidクイックソート( int *b, int下限, int上限)
  3. {
  4. //スワップ関数 
  5. void Sawp( int *a, int *b);
  6. 古い低= 低値;
  7. 古い高=高;
  8. (<高)
  9. {
  10. (*(b+high)>=*(b+low)&&low<high)high-- の場合;
  11. Sawp(b+low,b+high);
  12. (*(b+low)=<*(b+high)&&low<high)low++の場合;
  13. Sawp(b+low,b+high);
  14. }
  15. (Old_low<low-1)の場合
  16. {
  17. クイックソート(b,Old_low,low-1);
  18. }
  19. (高+1<古い高)の場合
  20. {
  21. クイックソート(b,high+1,Old_high);
  22. }
  23. }
  24.  
  25. //スワップ関数 
  26. void Sawp( int *a, int *b)
  27. {
  28. 整数温度;
  29. 温度=*a;
  30. *a=*b;
  31. *b=一時;
  32. }

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

原文: http://www.cnblogs.com/couhujia/archive/2011/03/24/1993373.html

<<:  基本的なプログラミングアルゴリズムを簡単にマスターする(パート3)

>>:  基本的なプログラミングアルゴリズムを簡単に習得する(I)

ブログ    
ブログ    

推薦する

人工知能の発展は私たちの生活にどのような影響を与えるのでしょうか?

防疫期間中の電子温度測定ドアから、宅配業界で使用されているドローンやロボットによる仕分け、私たちがよ...

将来ロボットは人間の皮膚を持つようになるかもしれないが、その外見はかなり恐ろしい

ロボットは科学者の主な研究分野となっており、この分野の技術が進歩し続けると、ロボットがこの社会の主な...

GPT-5 プレビュー!アレン人工知能研究所がGPT-5の新機能を予測する最も強力なマルチモーダルモデルを発表

GPT-5 はいつ登場し、どのような機能を持つのでしょうか?アレンAI研究所の新しいモデルがその答え...

AI時代のIVRテスト:人間と機械のギャップを埋める

対話型音声応答 (IVR) システムにおける人工知能 (AI) の変革的役割と、それが IVR テス...

コンピューティングパワーがボトルネックにならないように、Xiaohongshu の機械学習の異種ハードウェア推論を最適化する方法

多くの企業が GPU コンピューティング能力の開発を組み合わせて、自社の機械学習の問題に対するソリュ...

プリンストン DeepMind は数学を使用して、LLM はランダムなオウムではないことを証明します。 「規模が大きいほど能力が強くなる」には理論的根拠がある

今日の物語の主人公は、サンジーヴ・アローラとアニルド・ゴヤルという二人の科学者です。アローラ氏はプリ...

Microsoft Office Family Bucket Edition GPT-4 の価格は月額 30 ドル、Azure は Llama 2 と提携

ここ数カ月、国内外のテクノロジー大手は大規模モデルをめぐって動きを見せているが、OpenAIを所有す...

パフォーマンスが最大480倍向上:Armが2つの新しいAIエッジコンピューティングチップ設計を発表

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

AI+サイエンス: PaddlePaddle をベースにした AlphaFold2 でタンパク質構造予測を実現

1958 年、FHC クリックは、生物学における重要なセントラルドグマである DNA -> R...

ワシントンポスト紙の李開復氏のコラム:お金を与えることでAI失業危機は解決するのか?シリコンバレーの大物は世間知らずすぎる

AI革命が到来し、それは最良の時代になるかもしれないし、最悪の時代になるかもしれない。それが良いこと...

...

...

ロボット工学の可能性を解き放つ:産業に革命を起こし、人々の生活を向上させる

ロボット工学は、SF の世界の概念から、あらゆる分野を変え、人間の生活を向上させる現実のものへと進化...

データ、AI、クラウドを活用してビル運営を変革する方法

CISO、CSO、およびそのチームは毎日、侵害を検出し、リスクを評価し、適切に対応するという課題に直...

NLPの問題の90%を解決する方法を段階的に教えます

[[223595]]はじめに: この記事では、著者の Emmanuel Ameisen が、機械学習...