1.什麼是複雜度分析?
(1)資料結構和演算法解決是「如何讓計算機更快時間、更省空間的解決問題」。
(2)因此需要從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。
(3)分別用時間複雜度和空間複雜度兩個概念描述效能問題,二者統稱為複雜度。
(4)複雜度描述的是演算法執行時間(或占用空間)與資料規模的增長關係。
2.為什麼要進行複雜度分析?
(1)和效能測試相比,複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強的特點。
(2)掌握複雜度分析,將能編寫出效能更優的**,有利於降低系統開發和維護成本。
3.如何進行複雜度分析?
(1)大o表示法
a.**
演算法的執行時間與每行**的執行次數成正比,用t(n)=o(f(n))表示,其中t(n)表示演算法執行總時間,f(n)表示每行**執行總次數,而n往往表示資料的規模。
b.特點
以時間複雜度為例,由於時間複雜度描述的是演算法執行時間與資料規模的增長變化趨勢,所以常量階、低階以及係數實際上對這種增長趨勢不產生決定性影響,所以在做時間複雜度分析時忽略這些項。
(2)複雜度分析法則
a.單段**看高頻:比如迴圈。
b.多段**取最大:比如一段**中有單迴圈和多重迴圈,那麼取多重迴圈的複雜度。
c.巢狀**求乘積:比如遞迴、多重迴圈等。
d.多個規模求加法:比如方法有兩個引數控制兩個迴圈的次數,那麼這時就取二者複雜度相加。
4.常用的複雜度級別?
(1)多項式階:隨著資料規模的增長,演算法的執行時間和空間占用,按照多項式的比例增長。包括,o(1)(常數階)、o(logn)(對數階)、o(n)(線性階)、o(nlogn)(線性對數階)、o(n^2)(平方階)、o(n^3)(立方階)。
(2)非多項式階:隨著資料規模的增長,演算法的執行時間和空間占用暴增,這類演算法效能極差。包括,o(2^n)(指數階)、o(n!)(階乘階)。
5.如何掌握好複雜度分析方法?
複雜度分析關鍵在於多練,所謂孰能生巧。
6.對專案進行效能測試,再做**的時間複雜度、空間複雜度分析,是多此一舉嗎?而且每段**都分析一下時間複雜度和空間複雜度是不是很浪費時間?
並不是多此一舉的,漸進時間,空間複雜度分析為我們提供了乙個很好的理論分析的方向,並且它是宿主平台無關的,能夠讓我們對我們的程式或演算法有乙個大致的認識,讓我們知道,比如在最壞的情況下程式的執行效率如何,同時也為我們交流提供了乙個不錯的橋梁,我們可以說,演算法1的時間複雜度是o(n),演算法2的時間複雜度是o(logn),這樣我們立刻對不同的演算法有了乙個「效率」上的感性認識。
當然,漸進式時間,空間複雜度分析只是乙個理論模型,只能提供給粗略的估計分析,我們不能直接斷定就覺得o(logn)的演算法一定優於o(n),針對不同的宿主環境,不同的資料集,不同的資料量的大小,在實際應用上面可能真正的效能會不同,個人覺得,針對不同的實際情況,進而進行一定的效能基準測試是很有必要的,比如在統一的一批手機上(同樣的硬體,系統等等)進行橫向基準測試,進而選擇適合特定應用場景下的最優演算法。
綜上所述,漸進式時間,空間複雜度分析與效能基準測試並不衝突,而是相輔相成的,但是乙個低階的時間複雜度程式有極大的可能性會優於乙個高階的時間複雜度程式,所以在實際程式設計中,時刻關心理論時間,空間度模型是有助於產出效率高的程式的,同時,因為漸進式時間,空間複雜度分析只是提供乙個粗略的分析模型,因此也不會浪費太多時間,重點在於在程式設計時,要具有複雜度分析的思維。
資料結構與演算法學習二
1 用js中object物件模擬集合set的資料結構 set集合中的資料結構 s s 即集合中的鍵 值相同。故,可令object物件中的鍵 值相同,來模擬set集合及其中的方法,如下 用js中object模擬實現集合set資料結構 es6中有set類,避免混淆這裡用set2 var set2 fun...
資料結構與演算法學習總結(一)
1.什麼是資料結構和演算法 資料結構,就是一組資料的儲存結構。演算法,就是運算元據的一組方法。資料結構是為演算法服務的,演算法要作用在特定的資料結構之上。2.為什麼要學習資料結構和演算法?1 對個人 資料結構和演算法是程式設計師的必修課程之一,能幫助我們寫出效能更優更好的 演算法,是一種解決問題的思...
資料結構與演算法學習
我想重新學習一下資料結構與演算法,打好基礎。to measure is to know.我們用演算法複雜度t n 來表示演算法的效率,效能。t n 的取值 所有問題規模為n的問題例項中,將他們的計算成本進行總體的比較,取出最壞情況下的值。有幾點需要catch,1.演算法執行的時間,會根據程式語言,作...