資料結構
我們如何⽤python中的型別來儲存⼀個班的學⽣資訊? 如果想要快速 的通過學⽣姓名獲取其資訊呢?
實際上當我們在思考這個問題的時候,我們已經⽤到了資料結構。列表和字 典都可以儲存⼀個班的學⽣資訊,但是想要在列表中獲取⼀名同學的資訊 時,就要遍歷這個列表,其時間複雜度為o(n),⽽使⽤字典儲存時,可將學 ⽣姓名作為字典的鍵,學⽣資訊作為值,進⽽查詢時不需要遍歷便可快速獲 取到學⽣資訊,其時間複雜度為o(1)。
我們為了解決問題,需要將資料儲存下來,然後根據資料的儲存⽅式來設計 演算法實現進⾏處理,那麼資料的儲存⽅式不同就會導致需要不同的演算法進⾏ 處理。我們希望演算法解決問題的效率越快越好,於是我們就需要考慮資料究 竟如何儲存的問題,這就是資料結構。
在上⾯的問題中我們可以選擇python中的列表或字典來儲存學⽣資訊。列表 和字典就是python內建幫我們封裝好的兩種資料結構。
概念資料是⼀個抽象的概念,將其進⾏分類後得到程式設計語⾔中的基本型別。 如:int,float,char等。資料元素之間不是獨⽴的,存在特定的關係,這些 關係便是結構。資料結構指資料物件中資料元素之間的關係。
python給我們提供了很多現成的資料結構型別,這些系統⾃⼰定義好的,不 需要我們⾃⼰去定義的資料結構叫做python的內建資料結構,⽐如列表、元 組、字典。⽽有些資料組織⽅式,python系統⾥⾯沒有直接定義,需要我們 ⾃⼰去定義實現這些資料的組織⽅式,這些資料組織⽅式稱之為python的擴 展資料結構,⽐如棧,佇列等。
演算法與資料結構的區別
資料結構只是靜態的描述了資料元素之間的關係。
⾼效的程式需要在資料結構的基礎上設計和選擇演算法。
程式 = 資料結構 + 演算法
總結:演算法是為了解決實際問題⽽設計的,資料結構是演算法需要處理的問題 載體
抽象資料型別(abstract data type)
抽象資料型別(adt)的含義是指⼀個數學模型以及定義在此數學模型上的⼀ 組操作。即把資料型別和資料型別上的運算捆在⼀起,進⾏封裝。引⼊抽象 資料型別的⽬的是把資料型別的表示和資料型別上運算的實現與這些資料類 型和運算在程式中的引⽤隔開,使它們相互獨⽴。
最常⽤的資料運算有五種:
插⼊ 刪除 修改 查詢 排序
順序表在程式中,經常需要將⼀組(通常是同為某個型別的)資料元素作為整體管 理和使⽤,需要建立這種元素組,⽤變數記錄它們,傳進傳出函式等。⼀組 資料中包含的元素個數可能發⽣變化(可以增加或刪除元素)。
對於這種需求,最簡單的解決⽅案便是將這樣⼀組元素看成⼀個序列,⽤元 素在序列⾥的位置和順序,表示實際應⽤中的某種有意義的資訊,或者表示 資料之間的某種關係。
這樣的⼀組序列元素的組織形式,我們可以將其抽象為線性表。⼀個線性表 是某類元素的⼀個集合,還記錄著元素之間的⼀種順序關係。線性表是最基 本的資料結構之⼀,在實際程式中應⽤⾮常⼴泛,它還經常被⽤作更複雜的 資料結構的實現基礎。
根據線性表的實際儲存⽅式,分為兩種實現模型:
順序表,將元素順序地存放在⼀塊連續的儲存區⾥,元素間的順序關係 由它們的儲存順序⾃然表示。 鍊錶,將元素存放在通過鏈結構造起來的⼀系列儲存塊中。
順序表的基本形式
圖a表示的是順序表的基本形式,資料元素本身連續儲存,每個元素所佔的存 儲單元⼤⼩固定相同,元素的下標是其邏輯位址,⽽元素儲存的實體地址 (實際記憶體位址)可以通過儲存區的起始位址loc (e )加上邏輯位址(第i個 元素)與儲存單元⼤⼩(c)的乘積計算⽽得,即:
loc(e) = loc(e ) + c*i
故,訪問指定元素時⽆需從頭遍歷,通過計算便可獲得對應位址,其時間復 雜度為o(1)。
如果元素的⼤⼩不統⼀,則須採⽤圖b的元素外接的形式,將實際資料元素另 ⾏儲存,⽽順序表中各單元位置儲存對應元素的位址資訊(即鏈結)。由於 每個鏈結所需的儲存量相同,通過上述公式,可以計算出元素鏈結的儲存位 置,⽽後順著鏈結找到實際儲存的資料元素。注意,圖b中的c不再是資料元 素的⼤⼩,⽽是儲存⼀個鏈結位址所需的儲存量,這個量通常很⼩。
圖b這樣的順序表也被稱為對實際資料的索引,這是最簡單的索引結構。
Python資料結構與演算法4 棧與佇列
構建棧 class stack object def init self self.list defpush self,item 新增乙個新的元素item到棧頂 defpop self 彈出棧頂元素 return self.list.pop def peak self 返回棧頂元素 if self....
資料結構與演算法(4)棧
後進者先出,先進者後出,就是典型的 棧 結構。從棧的操作特性上來看,棧是一種 操作受限 的線性表 只允許在一端插入和刪除資料。從功能上來說,陣列或鍊錶可以替代棧,但特定的資料結構是對特定場景的抽象,陣列或鍊錶暴露了太多的操作介面,操作上的確靈活自由,但使用時就比較不可控,自然也就更容易出錯。當某個資...
資料結構與演算法(4) 樹
結點的度 乙個結點含有的子樹的個數稱為該結點的度 葉結點 度為0的結點稱為葉結點,也可以叫做終端結點 分支結點 度不為0的結點稱為分支結點,也可以叫做非終端結點 結點的層次 從根結點開始,根結點的層次為1,根的直接後繼層次為2,以此類推 結點的層序編號 將樹中的結點,按照從上層到下層,同層從左到右的...