演算法學習筆記(十三)

2021-10-20 18:11:49 字數 1759 閱讀 9535

棧的例題

實現乙個棧,該棧帶有出棧、入棧、取最小元素3個方法。要保證這3個方法的時間複雜度是o(1)。

思路一:

1.建立乙個整型變數min,用來儲存棧中的最小元素。當第乙個元素進棧時,把進棧元素賦值給min,即把棧中唯一的元素當做最小值。

2.之後每當乙個新元素進棧,就讓新元素和min比較大小。如果新元素小於min,則min等於新進棧的元素;如果新元素大於或等於min,則不做改變。

3.當呼叫getmin方法時,直接返回min的值即可。

此時,該方法採用臨時變數暫存棧的最小值,但是只考慮到了進棧的場景,卻沒有考慮出棧的場景。

原本,棧中最小的元素是3,min變數記錄的值也是3.

這時,棧頂元素出棧了。

此時的min變數應該等於幾呢?

雖然此時的最小元素是4,但是程式並不知道。

詳細的解法步驟如下:

1.設原有的棧叫作棧a,此時建立乙個額外的「備胎」棧b,用於輔助棧a。

2.當第乙個元素進入棧a時,讓新元素也進入棧b。這個唯一的元素是棧a的當前最小值。

3.之後,每當新元素進入棧a時,比較新元素和棧a當前最小值的大小,如果小於棧a當前最小值,則讓新元素進入棧b,此時棧b的棧頂元素就是棧a當前最小值。

4.每當棧a有元素出棧時,如果出棧元素是棧a當前最小值,則讓棧b的棧頂元素也出棧,此時棧b餘下的棧頂元素所指向的, 是棧a當中原本第2小的元素,代替剛才的出棧元素成為棧a的當前最小值。(備胎轉正)。

5.當呼叫getmain方法時,返回棧b的棧頂所儲存的值,這也是棧a的最小值。

顯然,這個方法中進棧、出棧、取最小值的時間複雜度時o(1),最壞情況空間複雜度時o(n).

**:

public

class

prostack

}public integer pop()

return mainstack.

pop();

}public

intgetmin()

throws exception

return minstack.

peek()

;}public

static

void

main

(string[

] args)

}

這段**的第乙個輸出是3,因為當時的最小值是3,

第二個輸出是4,因為元素3出棧後,最小值是4。

堅持就是勝利。(以上例題來自網上資料,只是記錄學習。)

演算法學習筆記十三 隨機演算法

按照字典中使用的定義,當事件不可 地發生時,它被認為是隨機的。物件在沒有任何計畫的情況下被建立時稱為隨機。根本的問題是,隨機性是否真的存在,或者我們是否只使用這個術語來建模具有未知規律性的物件和事件。我們要檢查ri和rii是否包含相同的資料。通訊協議的複雜性是為了解決這個決策問題而必須在ri和rii...

演算法 學習筆記

1.輸入輸出演算法至少有乙個或多個輸出 2.有窮性 3.確定性 4.可行性 1.正確性a.演算法程式沒有語法錯誤 b.演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果 c.演算法程式對於非法的輸入資料能夠得出滿足規格說明的結果 d.演算法對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果...

演算法學習筆記

複雜度分析 1.只關注迴圈次數最多的一行 2.總複雜度等於量級最大 的複雜度 3.巢狀 的複雜度等於巢狀 內外複雜度的乘積 單鏈表結構和順序儲存結構的優缺點 儲存分配方式 時間效能 空間效能 單鏈表結構 用一組任意的儲存單元存放線性表元素 查詢 o n 插入和刪除 找到某位置的指標後,插入和刪除的時...