1.ブログの背景
今日、そこの同僚は、チェックコードであるため、機能の書き込みパフォーマンスのは非常に良いではない、反撃するために再構築された、と非常に薄い恐怖を考えると、今日は宇宙のブログの複雑さと時間の複雑さを説明するJSと1を共有します
表現の2.複雑
私たちは前に見てきたので、あなたは、物事の束が表示されることがあります
T(n) = O(f(n))
S(n) = O(f(n))
これは、Tは、アルゴリズムを実行するのに必要な総時間を表すランダウの記号と呼ばれ
S表さアルゴリズムに必要な総容量
F(n)はコード実行の合計数を表し
例えば
function go(n) {
var item = 0; // 这里执行了一次
for (var i = 0; i < n; i++) { //这里执行了N次
for (var j = 0; j < n; j++) { //这里执行了n*n次
item = item + i + j; //这里执行了n*n次
}
}
return item; //这里执行了一次
}
だから、このコードの上にあります 1+n+n*n*2+1=2+n+2n²
すなわち、T(N)= O(F(2 + N +2n²))であります
それから彼はこれらの定数は、決定的な役割を達成することはありません時に比較的大きいN、ので、この時間は、我々はこれらの定数を無視するように、時間の複雑さは、タイムコードの実行を参照してくださいする傾向である前に言いました、ここで、最大サイクルの順序がそれに見える単一のセグメントのためのコードの例であります
したがって、このコードの最後の時間複雑度は、T(N)= O(n²)であります
あなたは、正方形のプロットデータについて考えることができます
3.時間計算
定義3.1時間計算
まず、時間の複雑さ、何の接点があまりにも前に、あなたはそれが真実ではない、彼はコードが実行される時間を表し考えていない可能性がある場合は、この定義の時間計算が何であるか、アルゴリズムの時間計算アルゴリズムの実行時間がに従ってあること成長しているトレンドデータスケールは、その特定のタイムコードの実行を避けます
3.2いくつかの一般的な時間複雑
単純なO(N)
for (var i = 0; i < n; i++) { sum += i; }
Straightaway、コードの実行時間は完全にNによって制御され、T(N)= O(n)のように
もちろん、単純なOがあります(1)
function total(n) { console.log(1) }
どんなに、この機能に影響を与えるパラメータなしで、ビン上のコードは再度行くか、このコードはT(n)で表されていない= O(1)
- T(N)= O(n²)
上記の例では、2つのサイクルの1つ、コードの時間複雑さの複数を持ち上げた場合の計算の時間複雑度と言われています
function go(i) {
var sum = 0;
for (var j = 0; j < i; j++) {
sum += i;
}
return sum;
}
function main(n) {
var res = 0;
for (var i = 0; i < n; i++) {
res = res + go(i); // 这里是重点
}
}
コードの呼び出しの最初の部分内のコードのコード種別の第二段落の先頭に、これは内部コードであるように
行く:(1 + N)
主な機能には時間がある内(1+n*go)=(1+n+n*n)
したがって、最終的な時間計算量はT(N)= O(n²)であります
複雑以上3.3時間ブロックコード
トップ距離T(N)= O(n²)の説明は、内部に別の関数を呼び出し、これは2つの機能を乗算する際の複雑な関数です。
別のケースがあり、それは、コードブロック内のどの機能に言うことですが、この状況は、我々はそれだけでコードの最大ブロックの複雑さを取る必要があるときに、お互いを呼び出していませんでした
たとえば、
function go(n) {
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
console.log(1)
}
}
for (var i = 0; i < n; i++) {
console.log(2)
}
}
コードの上片は、最初のコードは、一例として、我々は上複雑であることを学んだ、2サイクルである
n²
このコードは、nは、以下の
Nはn²決定的な役割を達成していない場合にNが無限に近づくときに、コードの上片の時間複雑度は、最大値n²を取るために、このケースである場合
3.4オーダーのペアと状況を追加します
var i = 1;
while (i <= n) {
i = i * 10;
}
この時間のように内部に、それぞれの条件によって判断されるように*私は、それが最後のサイクル数n倍にならないように、10ですが、その第十n回ながら、このコードでは、あなたが見ることができます時間複雑= N-10I、
I = logN個
これは、T(N)= O(LOGN)の時間計算量と結論されます
その後、サイクル数を増やすために、変数を変更している状況があり、共感は時間の複雑さを増加させることです
そのような追加の時間複雑などの他の例があります。
function go(m,n) {
for (var i = 0; i < n; i++) {
console.log(1)
}
for (var i = 0; i < m; i++) {
console.log(2)
}
}
この時間複雑でタイムコードがOであるように私たちは、小さい方に最適です最後にnとmを知ることができない、2つのサイクルがありますが、2つの仮パラメータがある上部のこの時期、内部関数内のコードを見て(M + N)
4.空間的複雑
複雑4.1空間の定義
その上でそうしますと比べて時間の複雑さの多くは、より良い理解を持って、ビューの名前には、時間の複雑さは、コードの実行時間を確認する傾向が、同じ理由で、スペースの複雑さは、職業を指し、トレンドメモリ
4.2一般的なスペースの複雑さ
宇宙の複雑さには、時間複雑性は、共通の非常に少ない、非常に複雑ではないです
結局、私はそれ変数を宣言誰もトリックの様々な循環されていないことを感じています。。。
もしそうなら、殺してください。。。。
O(1)
= 1をみましょう。
B = 1ましょう。
C = 1ましょう。
D = 1ましょう。
非常に単純な、O(1)
O(n)
せARR =アレイ(N)
このコードを参照して、コードが長さnの配列を作成し、そのように、Nによると、配列の長さが決定されることが明らかである
O(N)
変数を宣言する内部ループ内に保持されていない場合、唯一のケースの値を変更すると、棚スペースの複雑ではないので、何の使用サイクルが存在しない、説明しなければなりません
O(n²)
せARR = []
のための(VAR i = 0; iがn <; iは++){
ARR [I] =私
用(VARのJ = 0; J <nであり、j ++){
ARR [I] [J] = J
}
}
このコードは非常にエキサイティングではありませんどのように、激しい表情、私はこのような場合には、一般的には死aにこん棒ことになると思います。。。
複雑な最適化
私は、最適化は、誰もが様々な複雑さのグラフを見てのために絵をパイレーツ前に言いたいと誰もが直感的に理解しているが容易になります
比較的単純な最適化の例を与えるために、
console.time('a')
function go(n) {
var item = 0;
for (var i = 1; i <= n; i++) {
item += i;
}
return item;
}
console.timeEnd('a')
console.time('b')
function go2(n) {
var item = n*(n+1)/2
return item;
}
console.timeEnd('b')
go(1000)
go2(1000)
私たちは、どのような印刷を見ることができます
私は数の算術シーケンスの例を見て前に覚えて、あなたは数学が得意で、私を許していない願って、我々は、パフォーマンスの最適化の別の例を考えることはできません
それを読んだ後、私は時々このようなものは、比較的高プロファイルの例を見つけることが本当に重要である、あなたはこれらの概念を理解することを願って
フィボナッチは、今度は二つの第一および開始から第三に等しいです。
function Fibonacci(n) {
if (n <= 1 ) {
return n;
} else {
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
console.time('b')
Fibonacci(????)
console.timeEnd('b')
それを印刷しようとすることができます興味は、時間を見て、しかし、あなたは、ブラウザが応答しないはず持って、おそらく50回は、特定のプロットを調べてください。。。。
これらは、不十分または間違った時間と空間の複雑さの複雑さの私の理解のいくつかは、私が指摘したいです
o(* ̄▽ ̄*)ブ