『壹』 時間復雜度log怎麼算
如果程序運行的規模,每執行一次的規模是按等比例規模降低的,那麼這個演算法的時間復雜度就是logn的。
『貳』 堆排序和快排的平均時間復雜度為O(nlogn),是怎麼計算的呢
每次分成兩堆,遞歸邊界就是1,這個復雜度就是n*logn(底數為2)
『叄』 嚴蔚敏老師的《數據結構》里,關於時間復雜度的寫法,譬如logn,這個對數函數的底數是多少啊
演算法中log級別的時間復雜度都是由於使用了分治思想,這個底數直接由分治的復雜度決定。如果採用二分法,那麼就會以2為底數,三分法就會以3為底數,其他亦然。不過無論底數是什麼,log級別的漸進意義是一樣的。也就是說該演算法的時間復雜度的增長與處理數據多少的增長的關系是一樣的。
(3)logn時間復雜度的演算法擴展閱讀:
時間復雜度的計算方法
(1)一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得T(n)/f(n)的極限值(當n趨近於無窮大時)為不等於零的常數,則稱f(n)是T(n)的同數量級函數。
記作T(n)=O(f(n)),稱O(f(n))
為演算法的漸進時間復雜度,簡稱時間復雜度。
(2)在計算時間復雜度的時候,先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出 T(n) 的同數量級。
(3)在pascal中比較容易理解,容易計算的方法是:看看有幾重for循環,只有一重則時間復雜度為O(n),二重則為O(n^2),依此類推,如果有二分則為O(logn),二分例如快速冪、二分查找,如果一個for循環套一個二分,那麼時間復雜度則為O(nlogn)。
『肆』 i=1; while(i<=n) i=i*2 這個演算法的時間復雜度怎麼算
這個演算法的時間復雜度為logn。
一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。
並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
一般情況下,演算法的基本操作重復執行的次數是模塊n的某一個函數f (n),因此,演算法的時間復雜度記做:T (n) =0 (f (n) )。隨著模塊n的增大,演算法執行的時間的增長率和f (n)的增長率成正比,所以f (n)越小,演算法的時間復雜度越低,演算法的效率越高。
在計算時間復雜度的時候,先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出T (n)的同數量級。
(4)logn時間復雜度的演算法擴展閱讀
演算法的時間性能分析
演算法耗費的時間和語句頻度
一個演算法所耗費的時間=演算法中每條語句的執行時間之和
每條語句的執行時間=語句的執行次數(即頻度(Frequency Count))×語句執行一次所需時間
演算法轉換為程序後,每條語句執行一次所需的時間取決於機器的指令性能、速度以及編譯所產生的代碼質量等難以確定的因素。
若要獨立於機器的軟、硬體系統來分析演算法的時間耗費,則設每條語句執行一次所需的時間均是單位時間,一個演算法的時間耗費就是該演算法中所有語句的頻度之和。
『伍』 如何計算一個演算法的時間復雜度
你這個問題是自己想出來的吧?
第一,你指的時間復雜度是大o表示法的復雜度,也就是一個上界,但不是上確界,所以就算你以一種方式中斷排序過程,時間復雜度還是o(n*logn),假設排序過程還能執行的話。
第二,達到o(n*logn)的排序演算法,以快速排序為例,快速排序不知道你看過沒有,它不像選擇排序或者冒泡排序那樣,每一趟可以確定一直最大或者最小值,對於快速排序,每一趟排序後如果你刪掉最後一個元素將導致整個演算法失效。如果你要用這種刪除元素方法的話,只能採用冒泡排序或者選擇排序,時間復雜度是o(n^2)
所以,我猜想你是不是想做類似於在n個元素中尋找前k個最大者之類的事情(k=n-l)
如果是這樣的話,有復雜度是o(n*logk)的演算法,利用快速排序中的partition操作
經過partition後,pivot左邊的序列sa都大於pivot右邊的序列sb;
如果|sa|==k或者|sa|==k-1,則數組的前k個元素就是最大的前k個元素,演算法終止;
如果|sa|
k,則從sa中尋找前k大的元素。
一次partition(arr,begin,end)操作的復雜度為end-begin,也就是o(n),最壞情況下一次partition操作只找到第1大的那個元素,則需要進行k次partition操作,總的復雜度為o(n*k)。平均情況下每次partition都把序列均分兩半,需要logk次partition操作,總的復雜度為o(n*logk)。
由於k的上界是n,所以以n表示的總復雜度還是o(n*logn)
『陸』 各種排序的時間復雜度
各種常用的演算法,對時間復雜度的情況是這樣。直接插入排序,是n平方的時間復雜度。直接選擇排序是n平方的時間復雜度,冒泡排序也是n平方的時間復雜度。快速排序,希爾排序,和歸並排序,都是n×(logn)的時間復雜度
『柒』 演算法時間復雜度比較:根號n與logn相比哪個更優優多少試根據下圖猜想其演算法
米勒羅賓是logn的演算法,但是實際應用上它並不穩定,一般在范圍較大(int64范圍)才會用,一般的情況用的都是sqrt(n)的演算法,但是在需要判斷大量素數的情況下(假設判斷次數為m),一般是比較m*sqrt(n)和n的大小,如果前者小就暴力判斷,否則用篩法會更快。
然後比較,在不考慮常數的情況下是logn更優,但是演算法常數導致在數據較小的一些情況下sqrt(n)反而更快。
第一個根號n的:
#include<cmath>
inlineboolisPrime(intx){
if(x==2){returntrue;}
if(x<2){returnfalse;}
intpos=int(sqrt(x))+1;
for(inti=2;i<=pos;++i){
if(x%i==0){returnfalse;}
}
returntrue;
}
然後logn的米勒羅賓你可以看下博客網頁鏈接
然後提供一個篩法的代碼(stl版本)
#include<vector>
boolvis[MAXNUM];//MAXNUM就是最大數字
std::vector<int>primes;//儲存素數
inlinevoidgetPrimes(intmaxn){
for(inti=2;i<=maxn;++i){
if(!vis[i]){primes.push_back(i);}
for(size_tj=0;j<primes.size()&&primes[j]*i<=maxn;++j){
vis[primes[j]*i]=true;
}
}
}
實際應用一般用篩法或者sqrt(n)演算法,只有大數據才會用米勒羅賓
『捌』 如何計算時間復雜度
如何計算時間復雜度
定義:如果一個問題的規模是n,解這一問題的某一演算法所需要的時間為T(n),它是n的某一函數 T(n)稱為這一演算法的「時間復雜性」。
當輸入量n逐漸加大時,時間復雜性的極限情形稱為演算法的「漸近時間復雜性」。
我們常用大O表示法表示時間復雜性,注意它是某一個演算法的時間復雜性。大O表示只是說有上界,由定義如果f(n)=O(n),那顯然成立f(n)=O(n^2),它給你一個上界,但並不是上確界,但人們在表示的時候一般都習慣表示前者。
此外,一個問題本身也有它的復雜性,如果某個演算法的復雜性到達了這個問題復雜性的下界,那就稱這樣的演算法是最佳演算法。
「大 O記法」:在這種描述中使用的基本參數是 n,即問題實例的規模,把復雜性或運行時間表達為n的函數。這里的「O」表示量級 (order),比如說「二分檢索是 O(logn)的」,也就是說它需要「通過logn量級的步驟去檢索一個規模為n的數組」記法 O ( f(n) )表示當 n增大時,運行時間至多將以正比於 f(n)的速度增長。
這種漸進估計對演算法的理論分析和大致比較是非常有價值的,但在實踐中細節也可能造成差異。例如,一個低附加代價的O(n2)演算法在n較小的情況下可能比一個高附加代價的 O(nlogn)演算法運行得更快。當然,隨著n足夠大以後,具有較慢上升函數的演算法必然工作得更快。
O(1)
Temp=i;i=j;j=temp;
以 上三條單個語句的頻度均為1,該程序段的執行時間是一個與問題規模n無關的常數。演算法的時間復雜度為常數階,記作T(n)=O(1)。如果演算法的執行時 間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是一個較大的常數。此類演算法的時間復雜度是O(1)。
O(n^2)
2.1. 交換i和j的內容
sum=0; (一次)
for(i=1;i<=n;i++) (n次 )
for(j=1;j<=n;j++) (n^2次 )
sum++; (n^2次 )
解:T(n)=2n^2+n+1 =O(n^2)
2.2.
for (i=1;i<n;i++)
{
y=y+1; ①
for (j=0;j<=(2*n);j++)
x++; ②
}
解: 語句1的頻度是n-1
語句2的頻度是(n-1)*(2n+1)=2n^2-n-1
f(n)=2n^2-n-1+(n-1)=2n^2-2
該程序的時間復雜度T(n)=O(n^2).
O(n)
2.3.
a=0;
b=1; ①
for (i=1;i<=n;i++) ②
{
s=a+b;③
b=a;④
a=s;⑤
}
解: 語句1的頻度:2,
語句2的頻度: n,
語句3的頻度: n-1,
語句4的頻度:n-1,
語句5的頻度:n-1,
T(n)=2+n+3(n-1)=4n-1=O(n).
O(log2n )
2.4.
i=1; ①
while (i<=n)
i=i*2; ②
解: 語句1的頻度是1,
設語句2的頻度是f(n), 則:2^f(n)<=n;f(n)<=log2n
取最大值f(n)= log2n,
T(n)=O(log2n )
O(n^3)
2.5.
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
for(k=0;k<j;k++)
x=x+2;
}
}
解: 當i=m, j=k的時候,內層循環的次數為k當i=m時, j 可以取 0,1,...,m-1 , 所以這里最內循環共進行了0+1+...+m-1=(m-1)m/2次所以,i從0取到n, 則循環共進行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6所以時間復雜度為O(n^3).
我 們還應該區分演算法的最壞情況的行為和期望行為。如快速排序的最 壞情況運行時間是 O(n^2),但期望時間是 O(nlogn)。通過每次都仔細 地選擇基準值,我們有可能把平方情況 (即O(n^2)情況)的概率減小到幾乎等於 0。在實際中,精心實現的快速排序一般都能以 (O(nlogn)時間運行。
下面是一些常用的記法:
訪問數組中的元素是常數時間操作,或說O(1)操作。一個演算法 如 果能在每個步驟去掉一半數據元素,如二分檢索,通常它就取 O(logn)時間。用strcmp比較兩個具有n個字元的串需要O(n)時間 。常規的矩陣乘演算法是O(n^3),因為算出每個元素都需要將n對 元素相乘並加到一起,所有元素的個數是n^2。
指數時間演算法通常來源於需要 求出所有可能結果。例如,n個元 素的集合共有2n個子集,所以要求出所有子集的演算法將是O(2n)的 。指數演算法一般說來是太復雜了,除非n的值非常小,因為,在 這個問題中增加一個元素就導致運行時間加倍。不幸的是,確實有許多問題 (如著名 的「巡迴售貨員問題」 ),到目前為止找到的演算法都是指數的。如果我們真的遇到這種情況, 通常應該用尋找近似最佳結果的演算法替代之。