アルゴリズムの基礎:分析時間の複雑さ

1.時間の複雑さ

問題の規模、つまり処理するデータが増えると、必然的に基本操作の繰り返し実行回数が増えるので、気になるのは実行回数の桁違いです。

Oを使用して、一般的な時間計算量メトリックを表します。

  • 一定次数O(1)
  • 線形順序O(n)
  • 対数次数O(logn)
  • 線形対数次数O(nlogn)
  • 二乗次数O(n2)

もちろん、指数次数や階乗次数などの非常に複雑な尺度もありますが、これについては説明しません。

ここに画像の説明を挿入

2.毎回の複雑さの分析

O(1):

伝説的な一定次数の複雑さ。この複雑さは、データサイズnがどのように大きくなっても、計算時間は変わりません。

簡単な例を挙げると、nがいくら大きくなっても、この関数の計算時間には影響しないため、このコードの時間計算量はO(1)です。

const increament = n=>n++

オン):

線形時間計算量。データサイズnが増加すると、計算時間もnとともに線形に増加します。

典型的なO(n)の例は、線形探索です。

const linearSeach = (arr, target) =>{
    
    
	for (let i=0; i<arr.lenght; i++){
    
    
		if(arr[i] === target){
    
    
			return i
			}
		}
	return -1;//返回-1表示没有查询到target在arr中
}

線形探索の時間分解は、入力配列nの数に線形に比例します。nのスケールが増加すると、時間は線形に増加します。

O(ログ):

対数時間計算量。問題nのサイズが大きくなると、計算時間もn対数とともに増加します。

典型的な例は二分探索法です。

functions binarySearch(arr, target) {
    
     
	let max = arr.length - 1 
	let min = 0 
	while (min <= max) {
    
     
		let mid = Math.floor((max + min) / 2) 
		if (target < arr[mid]) {
    
     max = mid - 1 } 
		else if (target > arr[mid]) {
    
     min = mid + 1 } 
		else {
    
     return mid } 
	}
	return -1 
}

二分探索法のコードでは、whileループを介して検索範囲が2分の1に縮小されます。つまり、ループから抜け出すのにlog2 ^ n回かかります。

実際、実際のプロジェクトでは、O(logn)は非常に時間計算量が非常に優れています。たとえば、データサイズがn = 100の場合、二分探索法では7回、線形探索では100回検索する必要があります。これはギャップは大きくありませんが、データスケールが10億の場合、バイナリ検索は30回しか必要としませんが、線形検索は驚くべき10億回必要です。O(logn)時間計算量アルゴリズムは、データスケールの増加。彼の利点はより明白です。

O(nlogn):

線形対数時間計算量。データサイズnが増加すると、計算時間もnとともに線形に増加します。

これの典型的な代表はマージソートであり、対応するセクションでその複雑さを詳細に分析します。

待补充

O(n2)

複雑さのレベル、典型的な状況は、二重ループがある場合、つまり、O(n)コードが再びネストされ、その時間計算量がO(n²)である場合です。

代表的なアプリケーションは、バブルソートアルゴリズムです。

おすすめ

転載: blog.csdn.net/imagine_tion/article/details/112160522