演算法導論10 1

2022-07-07 15:36:10 字數 1604 閱讀 4946

本小節介紹了佇列,其實總結起來就兩句話:

棧:先入後出

佇列:先入先出

但是在介紹佇列的時候,講到了一種如同銜尾蛇一樣的定長佇列,和apache的circularfifoqueue實現是一致的。

仿照圖\(10-1\),畫圖表示一次執行操作\(push(s,4)\)、\(push(s,1)\)、\(push(s,3)\)、\(pop(s)\)、\(push(s,8)\)和\(pop(s)\)每一步的結果,棧\(s\)初始為空,儲存於陣列\(s[1..6]\)中。

說明如何在乙個陣列\(a[1..n]\)中實現兩個棧,使得當兩個棧的元素個數之和不為\(n\)時,兩者都不會上溢。要求\(push\)和\(pop\)操作的執行時間為\(o(1)\)。

分別將陣列的頭和尾作為兩個棧的棧底。

仿照圖\(10-2\),畫圖表示依次執行操作\(enqueue(q,4)\)、\(enqueue(q,1)\)、\(enqueue(q,3)\)、\(dequeue(q)\)、\(enqueue(q,8)\)和\(dequeue(q)\)每一步的結果,初始隊列為空,儲存於陣列\(q[1..6]\)中。

重寫\(enqueue\)和\(dequeue\)的**,使之能處理佇列的下溢和上溢。

enqueue(q,x)

if q.tail == q.length

error 'overflow'

else

q[q.tail] = x

q.tail = q.tail + 1

dequeue(q)

if q.tail == 1

error 'underflow'

else

x = q[q.head]

q.head = q.head + 1

return x

棧插入和刪除元素只能在同一端進行,佇列的插入操作和刪除操作分別在兩端進行,與它們不同,有一種雙端佇列,其插入和刪除操作都可以在雙端進行。寫出\(4\)個時間均為\(o(1)\)的過程,分別實現在雙端佇列的兩端插入和刪除元素的操作,該佇列是用乙個陣列實現的。

和上面的佇列**較為相似,只是現在陣列的首尾都可以進行操作,溢位判斷稍微複雜一點。

說明如何用兩個棧實現乙個佇列,並分析相關佇列的執行時間。

棧和佇列的不同在於彈出元素的位置不同。

棧: 棧頂出棧;佇列:隊首出隊;所以只需要把棧底元素之上的所有元素依次出棧,然後在另乙個棧入棧;

新增元素應該是一樣的為\(o(1)\);

彈出元素為\(o(n)\);

說明如何用兩個佇列實現乙個棧,並分析相關棧操作的執行時間。

和上題相似,將乙個佇列裡的元素倒騰到另乙個佇列中。

時間複雜度也是一樣的。

1 01 演算法引入

演算法的概念 演算法是計算機處理資訊的本質,因為電腦程式本質上是乙個演算法來告訴計算機確切的步驟來執行乙個指定的任務,一般地,當演算法在處理資訊時,會從輸入裝置或資料的儲存位址讀取資料,把結果寫入輸出裝置或某個儲存位址以後再呼叫。演算法是獨立存在的一種解決問題的方法和思想。演算法的五大特性 1.輸入...

演算法導論 隨機演算法

一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...

《演算法導論》 演算法導論2 2 1插入排序

2.1 插入排序。我們分析的第乙個演算法是插入排序演算法,輸入 n個數 a1,a2,a3,a4,a5,a6,a7 an 輸出 序列的乙個排列 即重新排序 a1 a2 a3 使a1 a2 a3 插入排序演算法的偽 是以乙個過程的形式給出的,稱為insertion sort,它的引數是乙個陣列。包括了n...