int i;for(i=0;i<n;i++){/*...*/};這里int 執行一次,for循環里的語句執行n次,所以T(n)=n+1;但是當n變大時,這個常數就顯得無足輕重了,所以它的算法復雜度為O(n)。同樣的,對于下面的代碼:int i,j;for(i=0;i<n;i++) for(j=0;j<n;j++){/*...*/};這里int 執行一次,嵌套的for執行了n*n次,所以T(n)=n2+1;同理,它的復雜度為O(n2)。那么,下面的代碼算法復雜度為多少呢?int i,j; for(i=0;i<n;i++) for(j=i;j<n;j++){/*...*/};這段代碼,int 執行一次,下面的for執行了n+(n-1)+(n-2)+...+1次,所以T(n)=1+(1+n)*n/2=n2/2+n/2+1。當n增大時,1和n/2都顯得無足輕重了,只剩下n2/2,但是之前說過大O只考慮階數,所以復雜度應該為O(n2)再來看看下面的代碼:
int i=1;while(i<n) i*=2;每次執行i都乘以2,設執行次數為x,那么2x≥n,我們只取等于的情況,得到x=log2n。所以這個循環的復雜度為O(logn),底數大小其實在n很大的時候是無足輕重的,所以不做考慮。
新聞熱點
疑難解答