關於執行時間中的對數:
書中的翻譯是這樣的:如果乙個演算法用常數時間(o(1))將問題的大小削減為其一部分(通常是1/2),那麼該演算法就是o(logn)。另一方面,如果使用常數時間只是把問題減少乙個常數(如將問題減少1),那麼這種演算法就是o(n)的。
翻譯很拗口,不過好在下面給出了三個例子:對分查詢、歐幾里得演算法和取冪運算,再結合前面的最大子串行和問題,我的理解是這樣的:無論是用迴圈還是遞迴,程式每次執行時都將變數減半(上面說的削減為一部分),並且迴圈和遞迴之外的語句是常數階複雜度o(1),也就是有確定的執行次數,這樣的程式往往是對數階的。
至於原理,直觀上來講,比如開始變數為n,每次變為1/2,需要logn次就可以讓變數從n變到1,此時也就是基準情況,所以執行次數就是logn了。更加準確的分析是使用遞推公式,例如上面的最大子串行和,遞迴之外的語句複雜度為o(n),設求解大小為n時時間為t(n),可以列出遞推公式:
t(1)=1;
t(n)=2t(n/2)+o(n);
把這裡的o(n)用n代替可以算出t(n)=nlogn+n=o(nlogn)
當然這個程式是所謂的「分治」方法,複雜度為nlogn的,並不是logn,但分析方法都是類似的,即通過遞推公式。
例如:最後的取冪運算問題,演算法如下:
long int pow(long int x, unsigned int n)
這裡面如果用乘法的次數衡量執行時間,或者連判斷也算上,總之每次遞迴內部都是o(1),列出的遞推式:
t(1)=1;
t(n)=t(n/2)+o(1);
把o(1)當1來算,可以得出來t(n)=logn+1=o(logn)。
不過這裡通過遞推得到公式都是寫出前幾項歸納的。。。至於真正怎麼去算這個公式是數學問題。。書裡預言了第七章會講。。
(《資料結構與演算法分析 c語言實現》mark allen weiss
資料結構與演算法分析 3 演算法執行時間中的對數
演算法思想 假定資料已被排序,查詢其中是否存在某個元素 演算法實現 int binsearch const vectora,int b else if a mid b else return 1 二分搜尋複雜度分析從right left n 1開始,每次折半,直到right left 1為止,演算法...
abap執行時間
abap 4的程式會需要花費大量的時間執行,而且會使其它程序被迫暫停以等待當前程式執行結束。這裡提供一些建議以提高你的程式執行速度和系統荷載。1.最主要的是儘量減少i o操作,然後是記憶體占用,在再就是cpu的負載。類似對硬碟的讀寫的i o操作是最耗費時間的。如果對記憶體的操作不加以控制,可能有些時...
程式執行時間
要獲得乙個c語言程式的執行時間,常用的方法是呼叫標頭檔案time.h,其中提供了clock 函式,可以捕捉從程式開始執行到clock 被呼叫時所 耗費的時間。這個時間單位是clock tick,即 時鐘打點 同時還有乙個常數clk tck,給出了機器時鐘每秒所走的時鐘打點數。於是為了獲 得乙個函式f...