分治法和二分法的時間複雜度簡明分析

2021-08-13 18:25:11 字數 1653 閱讀 9299

二分演算法,我們比較熟悉,時間複雜度是 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 ) 

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)

n 和 logn 裡的 n 意義一致,大小寫僅為了美觀

t( n ) = 2 t( n/2 ) + o( 1 ) 

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)

在計算機演算法這個話題內,log( 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 因為無論要查詢...