Python資料結構與演算法筆記(2)

2021-08-22 04:24:33 字數 2587 閱讀 7678

problem-solving-with-algorithms-and-data-structure-using-python 中文版

3 基本資料結構

棧、佇列、deques、列表是一類資料的容器,它們資料項之間的順序由新增或刪除的順序決定。一旦乙個資料項被新增,它相對於前後元素一直保持該位置不變。諸如此類的資料結構被稱為線性資料結構。

線性資料結構有兩端,有時候被稱為左右、某些情況被稱為前後,也可以稱為頂部和底部。將兩個線性資料結構區分開的方法是新增和移除項的方式,特別是新增和移除項的位置。

後進先出lifo,新增移除新項總發生在同一端。

棧的操作如下:

區分括號是否匹配的能力是很多程式語言結構的重要部分。

用棧來儲存括號。從空棧開始,從左到右處理括號字串。如果乙個符號是開始符號,將其作為乙個訊號,對應的結束符號稍後會出現。另一方面,如果符號是結束符號,彈出棧,只要彈出棧的開始符號可以匹配每個結束符號,則括號儲存匹配狀態,如果任何時候棧上沒有出現符合開始符號的結束符號,則字串不匹配。最後,當所有符號都被處理後,棧應該是空的。

除2演算法:

a+b*c中綴表示式,將運算子放在後面a b c * + 字尾表示式,*緊接著在b和c之後出現,表示*具有高的優先順序,+優先順序低。

當我們處理表示式時,操作符必須儲存在某處,因為他們相應的右運算元還沒有看到。此外,這些儲存的操作符的順序可能由於它們的優先順序而需要翻轉。這是在該示例中的加法和乘法的情況,由於加法運算子在乘法運算子之前,並且具有較低的優先順序,因此需要在使用乘法運算子之後出現,由於這種順序的翻轉,考慮使用棧來儲存運算子直到用到它們是有意義的

假設中綴表示式是乙個由空格分隔的標記字串。操作符是*,/,+,-,以及左右括號。運算元是單字元a,b,c等。以下步驟將字尾順序生成乙個字串:

1. 建立乙個名為opstack的空棧以儲存運算子。給輸出建立乙個空列表。

2. 通過使用字串方法拆分將輸入的中綴字串轉換為標記列表

3. 從左到右掃瞄標記列表。

如果標記是運算元,將其附加到輸出列表的末尾。

如果標記是左括號,將其壓到opstack上

如果標記是右括號,則彈出opstack,直到刪除相應的左括號,將每個運算子附加到輸出列表的末尾

如果標記是運算子,*,/,+,-,將其壓入opstack。但是,首先刪除已經在opstack中具有更高或者相等優先順序的任何運算子,並將它們加到輸出列表中

4. 當輸入表示式被完全處理時,檢查opstack,仍然在棧上的任何運算子都可以刪除並加到輸出列表的末尾。

在掃瞄字尾表示式時,必須等待運算元,另一種方法是每當在輸入上看到運算子時,計算兩個最近的運算元。

假設字尾表示式是乙個由空格分隔的標記字串。運算子為*,/,+,-,運算元假定為單個整數值,輸出將是乙個整數結果。

1. 建立乙個名為operandstack的空棧。

2. 拆分字串轉換為標記列表。

3. 從左到右掃瞄標記列表。

如果標記是運算元,將其中字串轉換為整數,並將值壓到operandstack

如果標記是運算子*,/,+,-,將需要兩個運算元,彈出operandstack朗次。第一次彈出的是第二個運算元,第二個彈出的是第乙個運算元。執行算術運算後,將結果壓倒運算元棧中。

4. 當輸入的表示式被完全處理後,結果就在棧上,彈出operandstack並返回值

佇列是項的有序結合,其中新增新項的一端稱為隊尾,移除項的一段稱為隊首。當乙個元素從隊尾進入佇列時,一直向隊首移動,直到它稱為下乙個需要移除的元素為止。

最近新增的元素必須在隊尾等待。集合中存活時間最長的元素在隊首,這種排序稱為fifo,先進先出。

佇列操作如下:

模擬:燙手山芋

模擬:印表機

1. 建立列印任務的佇列,每個任務都有個時間戳。佇列啟動的時候為空。

2. 每秒(currentsecond):

是否建立新的列印任務?如果是,將currentsecond作為時間戳新增到佇列

如果印表機不忙並且有任務在等待

從印表機佇列中刪除乙個任務並將其分配給印表機

從currentsecond中減去時間戳,以計算該任務的等待時間

將該任務的等待時間附件到列表中稍後處理

根據列印任務的頁數,確定需要多少時間

印表機需要一秒列印,所以得從該任務所需的等待時間減去一秒

如果任務已經完成,換句話說,所需的時間已經達到0,印表機空閒

3. 模擬完成後,從生成的等待時間列表中計算平均等待時間

雙端佇列是與佇列類似的項的有序集合。有兩個端部,首部和尾部,並且項在集合中保持不變,deque不同的地方是新增和刪除項是非限制性的。可以在前面或後面新增新項。同樣,可以在任一端移除現有項。在某種意義上,這種混合線性結構提供了單個資料結構中的棧和佇列的所有能力。

deque的操作:

回文檢查:

無序列表的結構是項的集合,其中每個項保持相對於其他項的相對位置。無序列表可能的操作:

有序列表是項的結合,其中每個項儲存基於項的一些潛在的特性的相對位置,排序通常是公升序或降序,並且我們假設列表具有已經定義的有意義的比較運算,需要有序列表操作與無序列表操作相同:

Python資料結構與演算法筆記(3)

problem solving with algorithms and data structure using python 中文版 4 遞迴 遞迴是一種解決問題的方法,將問題分解為更小的子問題,直到得到乙個足夠小的問題可以被很簡單地解決,通常遞迴設計函式呼叫自身。遞迴允許我們編寫優雅的解決方案,...

Python資料結構與演算法筆記(6)

problem solving with algorithms and data structure using python 中文版 7 圖和圖的演算法 頂點 邊 權重 路徑 迴圈 沒有迴圈的圖形稱為非迴圈圖 沒有迴圈的有向圖稱為有向無環圖或dag。圖抽象資料型別如下 實現圖的兩種方式 鄰接矩陣和...

資料結構與演算法(python) 學習筆記

1 集合和字典一樣,它們的元素沒有乙個明確定義的順序 2 慎用 beta 4,5 有坑 3 常用的序列運算子 s t序列的連線,k s序列連線,val in s檢查元素val在序列s中,val not in s 檢查元素val不在序列s中 4 慎用break和continue語句,有坑 5 在函式中...