大O法時間複雜度計算

2022-05-12 01:36:44 字數 1153 閱讀 8063

困惑的點——log,如何計算得出?

① 上限:用來表示該演算法可能有的最高增長率。

② 大o表示法:如果某種演算法的增長率上限(最差情況下)是f(n),那麼說這種演算法「在o(f(n))中」。n為輸入規模。

上限的精確定義:對非負函式t(n),若存在兩個正常數c和n0,對任意n>n0,有t(n)

——t(n)表示演算法的實際執行時間;

——f(n)是上限函式的乙個表示式。

我們總是試圖給演算法的時間代價找到乙個最「緊」(即最小)的上限,因此一般說順序搜尋法在o(n)中,而不是等於,因為也可以說它在o(n2)中。可以理解為o為上限的集合?

幾個例子:

①sum=0;

for(i=1;i<=n;i++)

sum+=n;

for迴圈執行,時間代價為o(n)。

②sum=0;

for(i=1;i<=n;i++)

for(j=1;j<=i;j++)

sum+=n;

內層迴圈執行i次,外層執行n次,但是每一次內層迴圈的時間代價都因i的變化而不同。可以看到,第一次執行外層迴圈時i=1,第二次執行時i=2。每執行一次外層迴圈,i就以1的步長遞增,直至最後一次i=n。因此,總的時間代價是從1累加到n,即 ,總執行時間為o(c3n2+c2n+c1),可化簡為o(n2)。

③ 雙重迴圈如排序,時間代價也為o(n2),只不過執行時間為第二個程式的兩倍。上例中c3為1/2。

④sum=0;

for (k=1;k<=n;k=k*2)    //do log n times;

for (j=1;j<=n;j++)       // do n times;

內層迴圈執行次數恒為n。設外層迴圈執行次數為i,則迴圈結束時2i-1=n,i為logn,所以總時間代價為nlogn。

⑤sum=0;

for (k=1;k<=n;k=k*2)    //do log n times;

for (j=1;j<=k;j++)       // do k times;

外層迴圈同上,依舊是logn次,但內層迴圈次數為k,每次都隨著外層迴圈變數k值的變化而變化。設外層迴圈執行第i次,則k=2i-1,即內層執行2i-1次。外層執行一次內層執行20次,外層執行兩次內層21,一共執行20+21次,以此類推總的執行次數為 ,最終可化簡為o(n)。

關於大o法可參考:

大O表示法 時間複雜度

引入原因 用另乙個 通常更簡單的 函式來描述乙個函式數量級的漸近上界。定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式。t n 稱為這一演算法的 時間複雜度 某個演算法的複雜度到達了這個問題複雜度的下界,那就稱這樣的演算法是最佳演算法 決定演算法複雜度的是執...

大O表示法和時間複雜度

學資料結構和演算法的目的 實現程式的高速執行,那麼必然要了解複雜度。複雜度分為兩個維度 時間 空間。在開發過程中,我們希望時間和記憶體消耗都越少越好,但很多時候無法做到兼顧,需要在時間和空間之間做出取捨已達到最佳狀態。對複雜度的計算一般採用事前分析估算的方法,即大o表示法。接下來讓我們進入複雜度的學...

時間複雜度 大O演算法

演算法的執行效率,就是演算法 的執行時間。我們需要能夠用肉眼就看出一段 的執行時間。int cal int n return sum 2,3行都執行了1個unit time的執行時間,4,5行都執行了n遍,所以是2n unit time的執行時間,所以一共是 2n 2 unit time。所有的 的...