6 設計一個 Web Browser 的回溯機制時,若要同時支援「上一頁」與「下一 頁」功能(即在回退後仍能前進),最有效率的實作方式是使用:
(A)單一個大型 Stack
(B)兩個 Stacks 分別儲存前進與後退歷史
(C)循環迴圈式的 Queue(Circular Queue)
(D)使用雙緩衝(Double Buffering)技術
統計: A(5), B(33), C(11), D(1), E(0) #3866774
詳解 (共 1 筆)
分別針對各個選項的說明已
(A) 單一個大型 Stack
-
結構特性:後進先出(LIFO)。資料只能從最頂端推入(Push)與取出(Pop)。
-
實作困境:單一 Stack 只適合處理單向操作。
-
當你瀏覽
網頁A -> 網頁B -> 網頁C時,Stack 堆疊為[A, B, C]。 -
點擊「上一頁」回到 B 時,C 必須被 Pop 彈出。
-
問題點:Pop 出去的 C 已經從 Stack 消失了;此時如果你想點「下一頁」回到 C,單一 Stack 已經找不到 C 的資料。如果為了保留 C 而不 Pop,Stack 的指標移動會變得極為複雜,且無法自然處理「瀏覽新網頁時切斷舊分支」的需求。
-
(B) 兩個 Stacks 分別儲存前進與後退歷史(正確答案)
-
結構特性:使用兩個獨立的 Stack,分別為 Back Stack(後退) 與 Forward Stack(前進)。
-
運作機制:
-
正常瀏覽:目前在網頁 A,當開啟網頁 B 時,把 A 放入 Back Stack,同時清空 Forward Stack。
-
點擊「上一頁」:把目前頁面 B 推入 Forward Stack,並從 Back Stack 取出最近的 A。
-
點擊「下一頁」:把目前頁面 A 推入 Back Stack,並從 Forward Stack 取出剛才暫存的 B。
-
-
優點:完美契合「後進先出」的邏輯,無論怎麼前後翻頁,時間複雜度都是高效的 $O(1)$。
(C) 循環 Queue(Circular Queue)
-
結構特性:先進先出(FIFO),且頭尾相連成一個環狀陣列。
-
不適用原因:Queue 的核心理念是「先到的先處理」(像排隊一樣)。
-
瀏覽歷史需要的是「回到最近一次看過的頁面」(後進先出),而不是「回到最早看過的頁面」(先進先出)。
-
雖然 Circular Queue 在記憶體空間回收上有優勢,但其 FIFO 的存取順序完全不符合瀏覽器「上一頁/下一頁」的邏輯。
-
(D) 使用雙緩衝(Double Buffering)技術
-
技術本質:屬於電腦繪圖(Computer Graphics)與硬體渲染領域的技術,與數據資料結構無關。
-
不適用原因:
-
原理:在記憶體中配置兩個畫面緩衝區(Front Buffer 與 Back Buffer)。CPU/GPU 在 Back Buffer 繪製下一幀畫面,繪製完成後再瞬間切換到屏幕顯示(Front Buffer),避免使用者看到畫面撕裂或閃爍。
-
用途:用於繪圖與遊戲畫面順暢度,完全不是用來紀錄使用者瀏覽歷程的機制。
-