【アルゴリズム】アルゴリズムを理解する(I)—アルゴリズムの時間計算量と空間計算量

【アルゴリズム】アルゴリズムを理解する(I)—アルゴリズムの時間計算量と空間計算量

[[407579]]

序文

大企業の秋季採用の先行スタートが始まっており、新卒採用の秋季大幅強化の警鐘が鳴らされている。これは、誰もが厳しい採用競争に挑まなければならないことを意味する。筆記試験や面接は就職活動において乗り越えなければならないハードルであり、アルゴリズムはほとんどの人にとって難しいハードルです。体系的な学習と理解、そして実践を通じてのみ克服することができます。

より多くの方にデータ構造とアルゴリズムを理解していただくために、新しいブログ投稿シリーズ「アルゴリズムを少し理解する」を開始します。皆様が辛い日々を乗り越えられることを願っています。私のアルゴリズム研究の能力には限界がありますが、皆さんがその本質を抽出し、そこから学んでいただければ幸いです。

アルゴリズムとは何か

アルゴリズムとは、データを操作し、プログラムの問題を解決するために使用される一連の方法のことです。

さまざまなアルゴリズムの長所と短所を測定する方法は 2 つあります。

  • 事後統計的手法: 統計、監視、およびコンピュータ タイマーを使用してさまざまなアルゴリズムの実行時間を比較することで、アルゴリズムの効率を判断できますが、非常に大きな制限があります。
  • 事前分析推定法: コンピュータ プログラムをコンパイルする前に、統計的手法に基づいてアルゴリズムを推定します。

たとえば、フィボナッチ数列のルールは次のようになります。数列は 3 番目の項から始まり、各項の値は前の 2 つの項の値の合計になります。つまり、0、1、1、2、3、5、8...です。

分析: フィボナッチ数列のパターンを観察すると、数列をアルゴリズムを使用して表現する場合、最初の 2 つの項と、3 番目の項から始まる要素の計算の 2 つのケースに分割する必要があることがわかります。

最も簡単な方法は、再帰を使用してフィボナッチ数列アルゴリズムを実装することです。

  1. 関数fib(num){
  2. if(num <= 1) numを返します
  3. fib(num - 1) + fib(num - 2)を返します
  4. }

もちろん、ループを使用してこれを実現することもできます。

  1. 関数fib(num){
  2. if(num <= 1) numを返します
  3. num1 = 0、num2 = 1 とします。
  4. (i = 0; i < num - 1; i++)の場合{
  5. // 各追加は前の2つの項目の合計です
  6. 合計をnum1 + num2とします。
  7. // 追加する前に、num2 が次の追加で num1 として使用されます。
  8. 数値1 = 数値2;
  9. // 加算の結果は次のnum2として使用されます
  10. num2 =合計;
  11. // ただし、上記の2つのコードは交換できません
  12. }
  13. num2を返します
  14. }

実際、高級プログラミング言語で書かれたプログラムがコンピューター上で実行されるのにかかる時間は、次の要因によって異なります。

  • アルゴリズムが使用する戦略と方法(アルゴリズムの品質)
  • コンパイルされたコードの品質(ソフトウェアのパフォーマンス)
  • 問題の入力サイズ(必要な入力量)
  • マシンが命令を実行する速度(ハードウェア性能)

一般に、プログラムの実行時間は主にアルゴリズムの品質と問題の入力サイズによって決まります。

時間計算量と空間計算量

私たちは皆、ガウスの物語を学んだことがあります。主な内容は次のとおりです。ガウスが学生だったとき、先生は100以内のゼロ以外の自然数の合計を計算する方法、つまり1 + 2 + ... + 99 + 100 =を計算する方法を尋ねました。当時、多くの学生は最初から最後まで計算していましたが、ガウスは計算に忙しくなく、問題について考えていました。

ガウスは観察の結果、最初の項と最後の項の合計が 2 番目の項と最後から 2 番目の項の合計に等しく、101 になることを発見しました。また、他の項もこの規則に従うことも発見しました。全部で50組あるので、結果は101×50=5050となります。それで彼はクラスで最初に答えを計算した人になりました。

これは真実です。ナイフを研ぐことは木を切る作業を遅らせることはなく、正しい方法を使用すれば作業が容易になります。

それでは、ガウスアルゴリズムと従来のアルゴリズムの長所と短所を詳しく分析してみましょう。

従来のアルゴリズム:

  1. 関数commonFunc(){
  2. let sum = 0; // 1回実行
  3. for (let i = 1; i <= 100; i++){ //n+1回実行
  4. sum += i; //n回実行
  5. }
  6. 戻る  sum ; // 1回実行
  7. }

ガウスアルゴリズム:

  1. 関数guassFunc(){
  2. let sum = 0; // 1回実行
  3. sum = (1 * n) * n/2; // 1回実行
  4. 戻る  sum ; // 1回実行
  5. }

上記のように、従来のアルゴリズムの実行回数は 2n+3 回であるのに対し、ガウスアルゴリズムの実行回数は 3 回です。最初と最後のステートメントの実行回数は同じなので、中間のアルゴリズムの主な焦点は n 回と 1 回の差です。ガウスアルゴリズムが従来のアルゴリズムよりはるかに優れていることは明らかです。

アルゴリズムの時間計算量

データ構造でアルゴリズムの時間計算量がどのように定義されているかを見てみましょう。

アルゴリズムの時間計算量: アルゴリズム分析を実行する場合、ステートメント実行の総数 T(n) は問題のサイズ n の関数であり、次に n による T(n) の変化が分析されて T(n) の大きさの順序が決定されます。アルゴリズムの時間計算量は、アルゴリズムの時間測定値であり、T(n)=O(f(n)) と表されます。これは、時間スケール n が増加すると、アルゴリズム実行時間の増加率が f(n) の増加率と同じになることを意味し、これはアルゴリズムの漸近的時間計算量、または略して時間計算量と呼ばれます。

翻訳してみましょう。時間計算量は、プログラムの実行時間を見積もるために使用される尺度です。アルゴリズムの問​​題サイズが n で、演算単位数 (プログラムが消費する時間を表すために使用される) が n であると仮定すると、データ サイズ n が増加するにつれて、アルゴリズム実行時間の増加率は f(n) の増加率と同じになり、時間計算量 O(f(n)) と呼ばれます。

T(n)=O(f(n))

  • T(n)はコード実行時間を表す
  • nはデータのサイズを表す
  • f(n)は各コード行が実行される合計回数を表す。
  • Oはコード実行時間T(n)がT(n)に比例することを意味する。

上記の説明では、アルゴリズムの時間計算量を反映するために O() が言及されており、これはビッグ O メソッドとも呼ばれます。 Big O は上限を表すために使用されます。つまり、アルゴリズムの最悪ケース実行時間の上限、つまり最悪のケースで実行にかかる時間を表すために使用されます。

Big O メソッドの導出:

  • ランタイム内のすべての加算定数を定数1に置き換える
  • 関数の実行回数の修正では、最高次の項のみが保持される。
  • 最高次の項が存在し、それが1でない場合は、それに掛けられる定数を削除します。

次に、アルゴリズムの時間計算量の計算方法を次のように自分で練習してみましょう。

  1. 関数testFunc(n){
  2. for (let i = 0; i < n; i += i){ //1+log2(n)回実行する
  3. for (let j = 0; j < n; j++){ //n+1回実行する
  4. console.log( "yichuan" ); // (1+log2(n))*(n+1) 回実行する
  5. }
  6. }
  7. }

最初の for ループでは、i+=i、つまり i=i+i=2i であることがわかります。したがって、2i=n のとき、n=log2(n) になります。ループから抜け出すには、1+log2(n) ステートメントを実行する必要があります。 2 番目の for ループでは、ループから抜け出す前にステートメントを n+1 回実行する必要があり、print ステートメントは (1+log2(n))*(n+1) 回実行されます。実際、big O 表記法を使用して加法定数と最高次の係数を無視すると、nlogn 回の実行が得られ、O(nlogn) として記録されます。

アルゴリズムの時間計算量を計算するときは、高次項の実際の状況に基づいて、加法定数、最高次項の係数、および対数項の底を無視できることを覚えておいてください。

一般的なカウント順序は次のとおりです。

一般的なアルゴリズムの時間計算量の順序を計算するのにかかる時間の比較を見ることができます。

さまざまな時間計算量曲線は次のとおりです。

アルゴリズム空間の複雑さ

実際、コードを書くときは、時間と引き換えにスペースを完全に犠牲にしていることになります。アルゴリズムの時間計算量と同様に、空間計算量はアルゴリズムのストレージスペースとデータ サイズ間の増加関係を表します。

アルゴリズム空間の複雑さ: アルゴリズムに必要なストレージスペースを計算することで実現され、計算式は S(n)=O(f(n)) です。

  • nは問題の大きさを表す
  • f(n)は、ステートメント中のnが占める記憶領域の関数を表す。
  1. 関数spaceFunc(n){
  2. const arr = []; // コードの2行目
  3. arr.length = n; // コードの3行目
  4. ( i = 0; i < n; i++ とします){
  5. arr[i] = i * i;
  6. }
  7.    
  8. (j = n - 1; j >= 0; --j)の場合{  
  9. コンソールにログ出力します。
  10. }
  11. }

上記のコードを観察すると、次のことがわかります。コードの 2 行目では、変数 arr を格納するためのスペースがメモリ内に割り当てられ、空の配列が割り当てられます。コードの 3 行目では、配列の長さが n に設定され、配列には n undefined が自動的に入力されます。また、残りのコードはそれ以上のスペースを占有しないため、コード全体のスペース計算量は O(n) です。

最悪の場合と平均的な場合

最悪の実行時間は、プログラムの実行にかかる最大時間であり、これより悪いケースはありません。通常、実行時間について話すときは、最悪の場合の実行時間について言及しています。

平均ケース実行時間とは、プログラムが期待する平均時間を指しますが、実際のテストでは分析によって取得することが難しく、ある程度の実験データと推定が必要になります。

n 個の乱数の中から数字を検索する場合、最良のケースは最初の数字を検索して見つけることであり、時間の計算量は O(1) であることがわかっています。最悪のケースは、n 番目の数字を検索して見つけることです。したがって、数値を見つけるアルゴリズムの最悪の場合の時間計算量は O(n) であり、平均的な場合の時間計算量は O((1+n)/2)、つまり O(n/2) です。

まとめ

この記事では、アルゴリズムとは何か、アルゴリズムを使用する理由、アルゴリズムの時間計算量と空間計算量を測定する方法、アルゴリズムの最悪ケースと平均ケースの概念について説明します。

<<:  毛沢東選集と魯迅全集をAIに与えたところ、AIが書いた大学入試のエッセイは非常に適切だった。

>>:  IBM と KPMG が従業員をどのようにトレーニングしているかの秘密を明らかにします。トレーニングに AI を使用するのは良い考えでしょうか?

ブログ    
ブログ    
ブログ    

推薦する

マイクロソフトがローブを買収:一般の人々が人工知能を簡単に利用できるように

マイクロソフトは、人工知能はテクノロジー大手が反体制派を排除するための武器として利用されるべきではな...

平昌オリンピックに向けたパイロットプロジェクトとして5Gバスとドローンがデビュー

[51CTO.com オリジナル記事] 韓国 IT ブリーフィング (3 月第 3 週)今回のKor...

人気の説明: キャッシュ、キャッシュ アルゴリズム、キャッシュ フレームワークの概要

[[437580]]導入私たちは皆、キャッシュについて聞いたことがあります。キャッシュとは何かと尋ね...

...

NeurIPS 2023 入学結果が発表され、合格率は 26.1% でした

NeurIPS は世界で最も権威のある AI 学術会議の 1 つです。正式名称は Neural I...

再トレーニングなしでモデルを6倍圧縮:数学者チームが新しい量子化法を提案

RUDN大学の数学者チームは、再トレーニングに余分なリソースを費やすことなく、ニューラルネットワーク...

機械学習は「原子幾何学」の秘密を明らかにし、数学の発展を促進した

代数多様体とその方程式。代数幾何学は、一方では方程式の研究である代数学、他方では図形の研究である幾何...

...

人工知能の将来の展望と動向は何でしょうか?

AlphaGo の人間と機械の戦いから、自動運転車のロードトリップ、AI 合成アンカーの採用まで、...

クールなデュオ: AI が金融テクノロジーの進化にどのように役立つかを示す 6 つのケース スタディ

中国では、口座間の送金、銀行ローンの申請、取引の実行にインターネットを利用することが住民にとって日常...

機械が人間に取って代わるというのは空想ではありません。最初に影響を受けるのは 3 つの職業です。油断しないでください。

科学技術の継続的な発展により、多くの業界で「ロボット」が使用され、効率が向上するだけでなく、人件費も...

人工知能が人間の脳を再現できるかどうかは論争を巻き起こしている。米メディア「AIにはまだ限界がある」

[[239590]] 8月6日、自動運転車、ロボット医師、10億人を超える中国国民を対象とした社会...

ChatGPT がリリースされてから 1 年が経ちました。主要なオープン ソース モデルはすべて追いついたのでしょうか?

1年前の今日、ChatGPTが誕生し、人工知能の新しい時代が到来したように思えました。 ChatG...

ドローンによる食品配達が到来、こうした問題が注目を集めている

無人運転車による配達に続き、ドローンによる食品配達も現実化に向かって加速している。先日終了した202...