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²)である場合です。
代表的なアプリケーションは、バブルソートアルゴリズムです。
略