困惑的點——log,如何計算得出?
① 上限:用來表示該算法可能有的最高增長率。
② 大O表示法:如果某種算法的增長率上限(最差情況下)是f(n),那么說這種算法“在O(f(n))中”。n為輸入規模。
上限的精確定義:對非負函數T(n),若存在兩個正常數c和n0,對任意n>n0,有T(n)<cf(n),則稱T(n)在集合O(f(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;
{
sum++;
}
內層循環執行次數恆為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;
{
sum++;
}
外層循環同上,依舊是logn次,但內層循環次數為k,每次都隨着外層循環變量k值的變化而變化。設外層循環執行第i次,則k=2i-1,即內層執行2i-1次。外層執行一次內層執行20次,外層執行兩次內層21,一共執行20+21次,以此類推總的執行次數為 ,最終可化簡為O(n)。
關於大O法可參考:https://blog.csdn.net/yuhk231/article/details/60099774