程式=資料結構+演算法(瑞士 尼克勞斯·威茨 提出)
資料結構:邏輯結構 和 物理結構
邏輯結構:集合結構、線性結構、樹形結構、圖形結構
物理結構:資料儲存
演算法的基本特性:
輸入性 有零個或多個輸入
輸出性 至少有乙個或多個輸出
有窮性 演算法在執行有限步後能自動結束,不會出現無限迴圈
確定性 演算法的每一步都具有確定的含義,不會出現二義性
可行性 演算法的每一步都能夠通過執行有限操作完成
演算法的複雜度:時間複雜度(計算的時間) 和 空間複雜度(需要的記憶體空間)
度量時間複雜度:大o表示法 o( ) 度量乙個演算法好壞的重要指標
時間複雜度基本計算規則:
基本操作,即只有常數項,時間複雜度為 o(1)
順序結構,時間複雜度 按 加法計算
迴圈結構,時間複雜度 按 乘法計算
分支結構,時間複雜度取最大值 (if—elif—else)
判斷乙個演算法的效率時,往往只需要關注 運算元量的最高次項,其他 次要項 和 常數項可以忽略
在沒有特殊說明時,分析演算法的時間複雜度 都是指 最壞時間複雜度
所消耗的時間從小到大:
o(1) < o(log n) < o(n) < o(n log n) < o(n2)**
o(1) 無論有多少資料,以及操作就可以得出結論
o(n) 跟你的資料成正比1:1 乙個for迴圈
o(logn) 一次操作可以砍掉一半
o(n2) 更資料成正比1:2 兩個for迴圈
時間複雜度:陣列的查詢o(1)),新增和刪除o(n)
陣列是用來儲存一系列資料,但它往往被認為是一系列相同型別的變數,它可以儲存乙個固定大小的相同型別元素的順序集合。
線性表的基本特徵:
第乙個資料元素 沒有前驅元素
最後乙個資料元素 沒有後繼元素
其餘每個資料元素 只有乙個前驅元素和乙個後繼元素
線性表按物理儲存結構:順序表(順序儲存) 和 鍊錶(鏈式儲存)
順序表的優缺點:
優點:支援隨機訪問
缺點:插入和刪除操作需要移動大量的元素,造成儲存空間的碎片
鍊錶:合理運用空間
鍊錶的查詢效率o(n),刪除效率,新增效率o(1)
僅允許 在一端進行刪除或新增
後進先出
class
stack
(object):
def__init__
(self)
: 例項屬性的初始化和賦值
self.stack=
defadd
(self,item)
: 向棧中新增元素
defpop
(self)
: 彈出 棧頂元素
iflen(self.stack)==0
:return
none
else
:return self.stack.pop(
)def
peek
(self)
: 返回 棧頂元素
iflen(self.stack)==0
:return
none
else
:return self.stack[-1
]def
is_empty
(self)
: 判斷是否為空 空返回 true 不為空 返回 false
return self.stack ==
defsize
(self)
: 檢視長度
return
len(self.stack)
s=stack(
)print
(s.pop())
print
(s.peek())
print
(s.is_empty)
p.add(
1)
p.add(
2)
p.add(3)
print
(s.pop())
print
(s.peek())
print
(s.is_empty)
輸出結果:none
none
true32
false
一端進行插入,另一端進行刪除
先進先出
class
duilie
(object):
def__init__
(self)
: 例項屬性的初始化和賦值
self.duilie=
defadd
(self,item)
: 新增元素
defpop
(self)
: 刪除元素
iflen(self.duilie)==0
:return
none
else
:
retturn self.duilie.pop(0)
defis_empty
(self)
: 判斷是否為空 空返回 true 不為空 返回 false
return self.duilie ==
defsize
(self)
: 檢視長度
return
len(self.duilie)
d=duilie(
)print
(d.pop())
print
(d.is_empty(
))
d.add(
1)
d.add(
2)
d.add(3)
print
(d.pop())
print
(d.is_empty(
))
輸出結果: none
ture
1false
查詢o(logn),新增,刪除o(logn)
乙個每級跳過一定數量的資料的鍊錶
查詢,刪除,新增 o(1)
雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。
雜湊表衝突解決:
鏈結法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;
由於鏈結法中各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況。
開放定址法不用指標,潛在地節約了空間,用這些空間可存放更多的槽,從而潛在地減少了衝突,提公升了速度。
資料結構–樹
資料結構與演算法 時間複雜度與空間複雜度
解決乙個問題的方法可能有很多,但能稱得上演算法的,首先它必須能徹底解決這個問題 稱為準確性 且根據其編寫出的程式在任何情況下都不能崩潰 稱為健壯性 程式和演算法是完全不同的概念。演算法是解決某個問題的想法 思路 而程式是在根據演算法編寫出來的真正可以執行的 例如,要依次輸出一維陣列中的資料元素的值,...
資料結構 演算法複雜度
二 演算法的效能評價 三 真題解析 資料結構的第一章 緒論 包含的最後乙個重要內容是關於演算法的複雜度。這個考點一般會單獨出現在選擇題的前兩道,需要你熟練掌握演算法的基本概念 演算法時間複雜度和空間複雜度的分析判斷等。其次,還會出現在大題的程式設計部分,將演算法複雜度作為乙個限制條件,要求你給出滿足...
資料結構與演算法 複雜度分析
一 什麼是複雜度分析?1.資料結構和演算法解決是 如何讓計算機更快時間 更省空間的解決問題 2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。4.複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係...