二分演算法,我們比較熟悉,時間複雜度是 o(logn)。
分治演算法,時間複雜度是多少呢?大致是o(n)。
為什麼區別這麼大呢?因為二分是分治的乙個特殊情況,二分演算法是比較一次,直接扔掉不符合要求的那一半。分治不能這麼做,它只是做了劃分,並沒有減小問題規模。
注:因為分治演算法是個統稱,這裡的時間複雜度也只是個初略計算。
非常簡明的時間複雜度分析方法:
二分:通過o(1)的操作,將規模為 n 的問題變成了 n/2 的問題。
即:t( n ) = t( n / 2 ) + o( 1 )
分治:通過o(1)的操作,將規模為 n 的問題變成了2個 n/2 的問題。
即:t( n ) = 2 t( n / 2 ) + o( 1 )
區別:分治的問題規模並沒有變
對上面2個式子進行遞推:
t( n ) = t( n/2 ) + o( 1 )n 和 logn 裡的 n 意義一致,大小寫僅為了美觀t( n ) = t( n/4 ) + 2 o( 1 )
t( n ) = t( n/8 ) + 3 o( 1 )
… …[共 logn 次]
… t( n ) = t( 1 ) + logn·o( 1 )
t( n ) = o(logn)
t( n ) = 2 t( n/2 ) + o( 1 )在計算機演算法這個話題內,log( n ) 若沒有特殊說明,一般均指以t( n ) = 4 t( n/4 ) + 3 o( 1 )
t( n ) = 8 t( n/8 ) + 7 o( 1 )
… …[共 logn 次]
… t( n ) = n t( 1 ) + (2 logn - 1)·o( 1 )
t( n ) = o(n)
2
為底的對數,即
log2(n
)。大o運算法則:
n * o( 1 ) = o( n );c * o( n ) = o( n ); 【常數係數直接省略】
o( cm ) + o( cn ) = o( cm ); 【常數相加取最大項】
o( m ) * o( n ) = o( m * n);
注意理解t(n)
和o(n)
的區別:
t(n)
表示問題規模為 n 的時間複雜度,是乙個未知值的表示符號(代數式);
o(n)
表示時間複雜度是o(n)
,表示的就是乙個值,不是乙個代數式。只不過這個值是計算機演算法領域內的乙個值,表示成這個樣子也是比較奇葩。
原文計算的解釋
t( n ) = n t( 1 ) + (2 logn - 1)·o( 1 )因為 t( 1 ) = o( 1 ) ; // 規模為1的問題的時間複雜度為o( 1 )
(2 logn - 1) ·o( 1 ) = o( logn )
所以 t( n ) = o( n ) + o( logn )
t( n ) = o(n)
時間複雜度 二分法
二分法是每次取中間值與目標值進行判斷,若相同則返回中間值的標號,不同則將中間值賦給取值邊界較遠的一邊,再次取中間值進行比較,直至相同。先定義用於比較的陣列 for i 0 i10 10 二分法 int search int list,int num return m 第1次二分 n 2 第2次二分 ...
二分法時間複雜度計算
總共有n個元素,每次查詢的區間大小就是n,n 2,n 4,n 2 k 接下來操作元素的剩餘個數 其中k就是迴圈的次數。k在遞迴的時候也可以說是遞迴的深度 由於n 2 k取整後 1,即令n 2 k 1,可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 總結一下就是 二分...
二分法時間複雜度計算分析
二分法即在查詢的同時先將被查詢的鍵和子陣列的中間鍵進行比較。如果被查詢的鍵小於中間鍵,則在左子陣列 中繼 續查詢,如果大於就在右陣列中繼續查詢,否則中間鍵就是我們要找的鍵。首先我們假設f n 為使用二分法在長度為n的有序列表中查詢特定鍵的查詢次數,則易得不等式 f n f n 2 1 因為無論要查詢...