時間複雜度和空間複雜度

2021-10-20 10:54:17 字數 2085 閱讀 7803

在解決問題的時候,我們通常不是一下子把資料處理完,更多的時候需要先把它們放在乙個容器裡,等到一定的時刻再把它們拿出來。使用「資料結構」是一種「空間換時間」思想的體現,「空間換時間」的思想會體現在我們學習「演算法與資料結構」的整個過程中,恰當使用資料結構可以幫助我們高效地處理資料。所謂恰當,是指針對具體的問題場景,使用了合適的資料結構。

下面是一些常見的資料結構的經典應用場景:

資料結構

應用場景

棧符合「後進先出」的規律

佇列符合「先進先出」的規律

雜湊表(雜湊表)

實現「快速訪問」資料的功能

二分搜尋樹(紅黑樹、b 樹系列)

維護了一組資料的順序性,得到乙個資料的上下界

並查集用於處理不相交集合的「動態」連線問題

優先佇列

有「動態」新增、刪除資料且需要獲得最值的場景

字典樹(trie)

用於儲存和統計大量的字串和相關的資訊

線段樹處理陣列的區間資訊的彙總(求和、最值等)、單點更新、區間更新問題

樹狀陣列

處理陣列的字首和、單點更新、區間更新問題

為什麼需要這麼多資料結構呢?答案是:沒有「完美的」資料結構與演算法。

沒有「完美的」資料結構與演算法

任何演算法都是一種交換。這句話的意思是我們沒有辦法得到所有想要得到的東西,總是要用某種東西交換另一種東西。有些朋友可能聽說過分布式系統有三個指標:

它們的第乙個字母分別是 c、a、p。這三個指標不可能同時做到,這個結論就叫做 cap 定理。對於演算法與資料結構同樣是這樣,時間效能和空間消耗通常來說是不可能同時最優的,乙個演算法和資料結構對於乙個任務來說是優點,但是放在另乙個場景下就可能是缺點。我們在進行演算法設計的時候,或者是用時間換空間,或者是用空間換時間,或者是綜合考慮了二者,設計乙個效能折中的方案。

總結

在這一小節的最後,我們做乙個總結。我們這門課程的定位與目標聽眾是:演算法與資料結構零基礎的朋友。演算法是解決問題的方法,資料結構是存放、處理資料的容器和快取。沒有「完美的」資料結構與演算法,我們需要針對具體問題給出最合適的解決方案。

學習建議

漸進時間複雜度

去係數、去常數、去低階

常數加法係數看做 0

一段程式必須要做的操作(常數次操作)不納入複雜度的計算。一般而言,常數次操作都不會是造成程式效能瓶頸的原因。

對於乙個多項式,只保留最高次冪的項,並且乘法係數化簡成 1

常見結論:

對數或者是含有對數乘法因子的項,對數底都看作 2

對數級別的時間複雜度,常見且典型的演算法是「二分查詢」,時間複雜度的表示式為 o(log n)

如果一段**有好幾個時間複雜度,那麼這段**的時間負責度= 最大的那個時間複雜度

如果有一段** 有兩個時間 複雜度 o(m) o(n),我們並不知道m和n分別是多少,所以這段**的時間複雜度為t(n)= o(m) + o(n) = o(m+n)

巢狀迴圈

t(n)= o(n) * o(n) = o(n2)

從上到下依次效能越來越差

常數階 o(1)

對數階 o(log n)

線性階 o(n)

線性對數階 o(nlogn)

平方階 o(n2)

立方階 o(n3)

…k次方階 o(nk)

指數階 o(2n)

階乘階 o(n!)

空間隨著輸入的資料規模變化 o(1)

空間隨著輸入的資料規模變化 o(n)

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...