《編程之美》讀書筆記18: 3.7 隊列中取最大數操作問題
若不使用C++新標準的右值引用,DeQueue的實現是低效的,因為要返回的元素只能通過賦值操作,而不能通過引用。(書上的實現代碼,竟然少了對EnQueue的實現?。?span lang=EN-US>
思路:用一個輔助隊列來記錄最大元素(為節省空間,只記錄其地址),當有一個元素入隊,就將輔助隊列尾端不大于該元素的全部出隊后(注意相等的也要出隊),再將該元素壓入輔助隊列,這樣就保證,輔助隊列從頭到尾的元素是遞減的,輔助隊列頭元素是當前隊列的最大值。當有一個元素出隊時,就與輔助隊列的頭部第一個元素所指的元素比較,如果是同一個元素(注意不是相等),輔助隊列頭部就執行出隊操作。
如果某個元素入隊時,輔助隊列有m次出隊操作,則這所對應的m個元素在入隊時,輔助隊列沒有執行出隊操作,平均下來,每個元素入隊時,輔助隊列入隊操作1次,出隊操作1次,時間復雜度為O(1)。)
為方便起見,函數名用push、pop、max,而不是EnQueue、DeQueue、MaxElement。
上面是隊列的實現,如果換成棧,則要更簡單:元素入棧時,如果比輔助棧的頂部元素大,就在輔助棧添加該元素,元素出棧時,如果與輔助棧的頂部元素所指的元素是同一個元素(不是相等),輔助棧就執行出棧操作。
輔助棧可以記錄最大元素的地址或在棧中的相對位置,后者相比前者,
優點:可以將所用容器改為vector,并且可以直接用一個對象對另一個對象賦值;
缺點:下標方式訪問元素相對較慢,特別是在deque容器。
Powered by: C++博客 Copyright © flyinghearts