目錄
空間效率,時間效率(較為關注)
時間複雜度:演算法中的操作執行次數,為演算法的時間複雜度。(不是具體時間,而是執行次數)
時間複雜度
(1)是乙個估算,看表示式中影響大的那一項,如n*n+2n+10中,n*n對整個式子影響最大,故其時間複雜度為n*n,用大o的漸近表示法o(n*n)。
(2)去掉時間表示式中的常數項乘積,例如,得到乙個準確的時間表示式為2n+10,則估算得到的時間複雜度為o(n)
(3)對於多個未知數時,例如時間表示式為n+m,假設m,n差不多大,則o(m)或o(n);假設m遠大於n,則o(m)。
(4)用常數1去替代所有確定的常數,如準確的時間表示式為100,o(1).
(5)未知數和常數,濾去常數。
(6)另外有些演算法分為最好,最壞,平均這三種情況。當演算法存在這三種情況時,選最壞的時間複雜度,例如假設字串長度為n,「sdsfrsgtr...」,遍歷字串,求s的時間複雜度,最好o(1),最壞o(n),平均o(n/2)。
a. 在氣泡排序中,
第一趟冒泡:n
第二趟冒泡:n-1
第三趟冒泡:n-2
第n趟冒泡:1
為等差數列,準確次數為: n*(n+1)/2
故氣泡排序時間複雜度為o(n*n)
b. 在二分查詢/折半查詢中:
假設二分了x次,有1*2*2....*2=n,2^x=n, x=(log2) n
演算法的複雜度計算中,喜歡省略成logn,因為不好寫底數,但是寫成lg n,是錯的。
c. 在某些階乘的運算中求時間複雜度:
long long factorial(size_t n)
如factorial(10),則返回factorial(9)*10,在返回到factorial(9)*8.....以此類推返回到
factorial(1)*2返回到1.(實際是10!)遞迴了n次,故時間複雜度為o(n)。(特別注意:結返回結果是n!,但是操作的次數是遞迴了n次,所以時間複雜度為o(n))
空間複雜度是演算法執行過程中臨時占用儲存空間大小的量度,不在意其具體佔了多少位元的大小,而是計算變數的個數。
對照時間複雜度的計算方法。注意:時間是累積的,空間是不累計的,空間可以銷毀。
例題1:消失的數字
思路1:排序 0 1 2 3 4 5 6 7 9 一次比較,若下乙個數與上乙個數隻差為1,則掠過,1,則找到,但時間複雜度不符合。
思路2:把0到n加到一起,結果ret1,再把陣列中的數加到一起ret2,ret1-ret2就是要找的數。
思路3:異或:相同vs**oqtx為0,相異為1。將陣列中的數與0-n數互相異或,最後剩下的那個數字就是缺的那個數。
int missingnumber(int* nums, int numssize)
nums[0]=tmp;}}
但此時時間複雜度為o(n*k),跑不過~
思路2:以空間換時間,嘗試著多消耗一點空間,一次換成。將後k個儲存,移到前面來,直接得到。時間複雜度為o(n),空間複雜度為o(n)
思路3:後k個逆置,前k個逆置,整體逆置(這個實在是太牛了!!)
c**為:
//逆置
void reverse(int *nums ,int left,int right)
注意結果可能出錯:
此時需要注意k是否大於n,當k>n時需要取模:k%=numssize
新增:if(k>numssize)
//逆置
void reverse(int *nums ,int left,int right)
//控制好下標,後n-k個
reverse(nums,numssize-k,numssize-1);
revers
reverse(nums,0,numssize-1);
}在力扣上執行得到:
關於時間複雜度
1.演算法複雜度分為 時間複雜度和空間複雜度。作用 時間複雜度是度量演算法執行的時間長短 而空間複雜度是度量演算法所需儲存空間的大小。2.一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f n 因此,演算法的時間複雜度記做 t n o f n 分析 隨著模組n的增大,演算法執行的時間的...
關於時間複雜度
關於時間複雜度 o 的定義 若f n 是正整數n的乙個函式,則o f n 表示 m 0 使得當n n0時,f n m f n0 表示時間複雜度的階有 o 1 常量時間階 o n 線性時間階 o n 對數時間階 o n n 線性對數時間階 o n k k 2,k次方時間階 例 兩個n階方陣的乘法 fo...
時間複雜度和空間複雜度詳解
本文 演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間...