検索
ホームページウェブフロントエンドjsチュートリアルアルゴリズムの時間計算量と空間計算量について説明する記事

アルゴリズムの時間計算量と空間計算量について説明する記事

Mar 04, 2022 pm 03:45 PM
時間の複雑さ空間の複雑さアルゴリズム

この記事ではアルゴリズムについて学び、アルゴリズムの時間計算量と空間計算量について紹介します。

アルゴリズムの時間計算量と空間計算量について説明する記事

アルゴリズムとは、データを操作してプログラムの問題を解決するために使用される一連のメソッドを指します。同じ問題に対して、異なるアルゴリズムを使用すると、最終結果は同じになる可能性がありますが、プロセスで消費されるリソースと時間は大きく異なります。

それでは、さまざまなアルゴリズムの長所と短所をどのように測定すればよいのでしょうか?

主にアルゴリズムが占める「時間」と「空間」の2つの次元から考えます。

  • 時間ディメンション: 現在のアルゴリズムの実行にかかる時間を指します。通常、これを説明するために「時間計算量」を使用します。

  • 空間次元: 現在のアルゴリズムを実行するために必要なメモリ空間の量を指します。通常、これを説明するために「空間複雑さ」を使用します。

したがって、アルゴリズムの効率の評価は、主に時間計算量と空間計算量に依存します。ただし、時間と空間が「ケーキを食べながらも食べる」場合があり、両方を同時に持つことはできないため、バランス ポイントを見つける必要があります。

「時間計算量」と「空間計算量」の計算方法をそれぞれ紹介します。

1. 時間計算量

アルゴリズムの「時間計算量」を知りたいです。多くの人が最初に考える方法は、アルゴリズム プログラムを 1 回実行することです。次に、それにかかる時間計算量を計算します。時間は自然にやってきます。

この方法は可能ですか?もちろんそれは可能ですが、多くのデメリットもあります。

この方法は動作環境の影響を非常に受けやすいため、高性能のマシンで実行した結果と、低パフォーマンスのマシンで実行した結果は大きく異なります。また、テストで使用されるデータの規模にも大きく関係します。さらに、アルゴリズムを作成した時点では、それを完全に実行する方法はまだありませんでした。

したがって、別のより一般的な方法が登場します。「 Big O notation」、つまり、T(n) = O(f(n))

としましょう。まず例を見てみましょう:

for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

Big O notation」を使用すると、このコードの時間計算量は次のようになります: O(n)、なぜですか?

In Big O 表記の時間計算量の公式は次のとおりです: T(n) = O( f(n) )、ここで f(n) はコードの各行の実行回数の合計を表し、O は比例関係、つまり完全な値を表します。この式の名前は次のとおりです: アルゴリズムの漸近時間計算量

引き続き上記の例を見てみましょう。コードの各行の実行時間が同じであると仮定します。それを表すために 1 パーティクル時間を使用します。この例の最初の行には 1 パーティクル時間がかかります。コードの 3 行目は 1 粒子時間かかります。行の実行時間は n 粒度時間で、4 行目の実行時間も n 粒度時間です (2 行目と 5 行目はシンボルなので、今のところ無視してください)。この場合、合計時間は 1 粒度時間 n 粒度時間 n 粒度時間、つまり (1 2n) 粒子時間、つまり: T(n) = (1 2n)*粒子時間 この結果から、このアルゴリズムの消費時間は n の変化とともに変化します。したがって、このアルゴリズムの時間計算量は次のように簡略化できます: T(n) = O(n)

なぜこのように簡略化できるのでしょうか?ビッグ O 表記は、コード実行時間の増加傾向を表すために使用される、アルゴリズムの実行時間を実際に表すために使用されないためです。

したがって、上記の例では、n が無限大の場合、T(n) = time(1 2n) の定数 1 は意味がなく、倍数 2 も意味がありません。したがって、T(n) = O(n) に単純化できます。

一般的な時間計算量のメトリクスは次のとおりです。

  • 定数次数 O(1)

  • 対数次数 O(logN )

  • 線形次数 O(n)

  • 線形対数次数 O(nlogN)

  • 二乗次数 O (n²)

  • 3 次 O(n³)

  • ##K 乗次数 O(n^k)

  • 指数次数 (2^n)

時間計算量は上から下に向かってますます大きくなり、実行効率はますます低くなります。

以下では、より一般的に使用されるものをいくつか選んで説明します (厳密な順序ではありません):

  • 定数順序 O(1)

コードを何行実行しても、ループなどの複雑な構造がない限り、このコードの時間計算量は O(1 )、たとえば:

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

上記のコードが実行されると、特定の変数が増加してもその消費量は増加しません。そのため、このタイプのコードがどれだけ長くても、たとえ数万個のコードがあったとしても、または数十万行の場合、O(1) を使用して時間計算量を表現できます。

  • #線形順序 O(n)

  • これは最初のコード例にあります。
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

このコードでは、for ループ内のコードが n 回実行されるため、n が変化すると消費時間が変化するため、このタイプのコードは次のようになります。時間計算量を表すために O(n) を使用しました。

  • #対数次数 O(logN)

    最初にコードを見てみましょう:
  • int i = 1;
    while(i<n)
    {
        i = i * 2;
    }

    从上面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2^n

    也就是说当循环 log2^n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)

    • 线性对数阶O(nlogN)

    线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

    就拿上面的代码加一点修改来举例:

    for(m=1; m<n; m++)
    {
        i = 1;
        while(i<n)
        {
            i = i * 2;
        }
    }
    • 平方阶O(n²)

    平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。

    举例:

    for(x=1; i<=n; x++)
    {
       for(i=1; i<=n; i++)
        {
           j = i;
           j++;
        }
    }

    这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(n*n),即 O(n²)

    如果将其中一层循环的n改成m,即:

    for(x=1; i<=m; x++)
    {
       for(i=1; i<=n; i++)
        {
           j = i;
           j++;
        }
    }

    那它的时间复杂度就变成了 O(m*n)

    • 立方阶O(n³)、K次方阶O(n^k)

    参考上面的O(n²) 去理解就好了,O(n³)相当于三层n循环,其它的类似。

    除此之外,其实还有 平均时间复杂度、均摊时间复杂度、最坏时间复杂度、最好时间复杂度 的分析方法,有点复杂,这里就不展开了。

    二、空间复杂度

    既然时间复杂度不是用来计算程序具体耗时的,那么我也应该明白,空间复杂度也不是用来计算程序实际占用的空间的。

    空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。

    空间复杂度比较常用的有:O(1)、O(n)、O(n²),我们下面来看看:

    • 空间复杂度 O(1)

    如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)

    举例:

    int i = 1;
    int j = 2;
    ++i;
    j++;
    int m = i + j;

    代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)

    • 空间复杂度 O(n)

    我们先看一个代码:

    int[] m = new int[n]
    for(i=1; i<=n; ++i)
    {
       j = i;
       j++;
    }

    这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

    以上,就是对算法的时间复杂度与空间复杂度基础的分析,欢迎大家一起交流。

    更多算法相关知识,请访问:编程入门!!

以上がアルゴリズムの時間計算量と空間計算量について説明する記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は知乎で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい