c語言復雜性
⑴ 如何分析c語言復雜類型
C語言聲明的復雜性多來自於各各種類型聲明的嵌套。最為典型的便是指針、函數以及數組三者之間的混用。要想准確地理解復雜聲明的確切含義,就需要一個清晰的條理邏輯。結合網路上的教程,修修補補完成了這篇教程。 網上的範例有很多,如:1、int (*func)(int *p);2、int (*func)( int *p, int (*f )( int*) );3、int func(void) [5]; 在逐個解析之前,要先說明一下解讀的方法,比較著名且有效的就是「右左法則」:"The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed." 「首先從最裡面的圓括弧看起,然後往右看,再往左看。每當遇到圓括弧時,就應該掉轉閱讀方向。一旦解析完圓括弧裡面所有的東西,就跳出圓括弧。重復這個過程直到整個聲明解析完畢。」 簡單來說,可以歸納為:1、先看標識符:從左往右,有小括弧括起來的算作一個。
2、再看右邊:標識符右邊有「[]」的,便為數組;有「()」的,便為函數。
3、最後看左邊:根據類型符確定該聲明的類型,有「*」說明是指針,需注意是否有括弧將「*」和類型符隔開。 以上面的聲明為例:1、int (*func)(int *p); int為類型符,(*func)為標識符,且右邊跟有(),說明這是函數,該函數的形參是一個整型指針(int *p)。由類型符int可知這是一個返回值為整型的函數。(*func)是一個函數,因此func就是一個指向函數的指針。因此,int (*func)(int *p)是一個以整型指針為形參,返回整型的函數指針。2、int (*func)( int *p, int (*f )( int*) ); 與上例較為類似,不同的只是多了一個形參,多的那個形參即為上例的聲明。3、int func(void) [5]; 該聲明實際上是一個非法的聲明。func是一個返回值為具有5個int元素的數組的函數。但C語言的函數返回值不能為數組,這是因為如果允許函數返回值為數組,那麼接收這個數組的內容的東西,也必須是一個數組,但C語言的數組名是一個右值,它不能作為左值來接收另一個數組(即數組名只能用來賦值而不可被賦值),因此函數返回值不能為數組,該聲明非法。 在實際的編程過程中,這樣的復雜聲明並不提倡。
⑵ C語言時間復雜度求解
(1)兩層循環,每層執行n次,時間復雜度為O(n^2)
(2)也是兩層循環,可以算出總共執行了多少次,其中n的最高次數為2,所以時間復雜度也為O(n^2)
(3)同上,O(n^2)
(4)循環體執行次數為n-1,時間復雜度為O(n)
(5)三層循環,每層執行n次,時間復雜度為O(n^3)
數據結構課程中,對演算法進行評估要求不是很高,只需大致算出語句執行了多少次即可,常見的、能寫成小段代碼考察的一般都是O(n^2)、O(n)、O(n^3),O(log N)的就那麼幾個,記住就行。
⑶ C語言裡面的復雜度是什麼
同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程序的效率。演算法分析的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間復雜度和空間復雜度來考慮。
1、時間復雜度
(1)時間頻度
一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
(2)時間復雜度
在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間復雜度概念。
一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間復雜度,簡稱時間復雜度。
在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間復雜度為O(1),另外,在時間頻度不相同時,時間復雜度有可能相同,如T(n)=n2+3n+4與T(n)=4n2+2n+1它們的頻度不同,但時間復雜度相同,都為O(n2)。
按數量級遞增排列,常見的時間復雜度有:
常數階O(1),對數階O(log2n),線性階O(n),
線性對數階O(nlog2n),平方階O(n2),立方階O(n3),...,
k次方階O(nk),指數階O(2n)。隨著問題規模n的不斷增大,上述時間復雜度不斷增大,演算法的執行效率越低。
2、空間復雜度
與時間復雜度類似,空間復雜度是指演算法在計算機內執行時所需存儲空間的度量。記作:
S(n)=O(f(n))
⑷ C語言時間復雜度求幫忙
這個題目,建議你去網路搜索下時間復雜度的演算法,和證明過程,很容易得出答案的。也可以來私我
⑸ 關於c語言編程的時間復雜度
printf("%d%c",a,c)算是一條語句。
strcmp(svyd,svyy)這個是一條基本計算
時間復雜度通常不這么看。
如果是一個for循環,比如
for(i = 0; i <n; i++)
{
printf("\n");
}
這樣算是o(n),是個線性的。
如果for裡面又一個for,那麼是o(n^2)。
建議看一下數據結構演算法相關的知識。
⑹ C語言,時間復雜度與空間復雜度,演算法時間公式T(n)=O(f(n)),與空間公式S(n)=O(f(n))
演算法的時間復雜度:
為了便於比較同一問題的不同演算法,通常從演算法中抽取一種或者多種有代表性的基本操作,再以這些基本操作重復執行的次數與問題規模的關系T(n) 作為演算法的時間性量度。
如果T(n) 和 f(n) 是n 的函數,當n →∞ 時,有T(n) / f(n) → c (常數c ≠ 0),記作:T(n) = O(f(n)),稱O(f(n)) 為演算法的漸近時間復雜度,簡稱時間復雜度。
演算法的空間復雜度:
一個演算法實現所佔存儲空間大致包含三方面:
1. 指令、常數、變數所佔用的存儲空間;
2. 輸入數據所佔用的存儲空間;
3. 演算法執行時所需的輔助空間;
前兩者是必須的,通常將演算法執行時所需的輔助空間作為分析演算法空間復雜度的依據:S(n) = O(f(n)),其中f(n)的規則與時間復雜度一致。
⑺ C語言演算法過於復雜怎樣改進
關於這個問題,並沒有一概而論的統一的說法。關鍵在於熟能生巧,在學習的時候不能滿足於解決的問題,而是要多交流,多看別人寫的程序,探究怎麼樣子簡化演算法?提高演算法的效率,降低演算法的時間復雜性。
⑻ C語言 時間復雜性
除非n是幾個,正常情況下一定是O(nlgn)<<O(2^n),因此O(nlgn)快得多
⑼ 什麼是C語言中的時間復雜度如何計算
時間復雜度不是相對於程序而言的,而是指問題的復雜
例如排序,對分查找在最劣情況下也是平方問題,但對於絕大多數問題而言,我們只關心平均效率。
例如稀疏數組,可以降低對空間的要求,但當有用數據超過一定規模,運行速度將急劇下降。
次數超過4的多項式沒有平凡解,所以被成為大O的N次方問題,這樣的問題總是需要那麼多時間才能完成計算,這就是時間的復雜度。
任何數據的壓縮都有極限,越是隨機的數據,越不能找到良好的數據結構,這就是空間的復雜性。
實際上如果沒有好的演算法和數據結構,大多數程序是無法真正做到應用的。
⑽ C語言演算法的時間復雜度如何計算啊
看看這個 每個循環都和上一層循環的參數有關。 所以要用地推公式: 設i(n)表示第一層循環的i為n時的循環次數,注意到他的下一層循環次數剛好就是n,分別是0,1,2...n-1 所以,把每一層循環設一個函數分別為:j(n),k(n),t(n) 則有 i(n)=j(0)+...+j(n-1) j(n)=k(0)+...+k(n-1) k(n)=t(0)+...+t(n-1) i(0)=j(0)=k(0)=0 t(n)=1 而總循環數是i(0)+i(1)...+i(n-1) 可以根據遞推條件得出准確值 所以演算法復雜度是O(i(0)+i(1)...+i(n-1))
記得點贊啊