1. 程式人生 > >【演算法與資料結構】連結串列

【演算法與資料結構】連結串列

1.如何分別用連結串列和陣列實現LRU緩衝淘汰策略?
1)什麼是快取?
快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。
2)為什麼使用快取?即快取的特點
快取的大小是有限的,當快取被用滿時,哪些資料應該被清理出去,哪些資料應該被保留?就需要用到快取淘汰策略。
3)什麼是快取淘汰策略?
指的是當快取被用滿時清理資料的優先順序。
4)有哪些快取淘汰策略?
常見的3種包括先進先出策略FIFO(First In,First Out)、最少使用策略LFU(Least Frenquently Used)、最近最少使用策略LRU(Least Recently Used)。
5)連結串列實現LRU快取淘汰策略
當訪問的資料沒有儲存在快取的連結串列中時,直接將資料插入連結串列表頭,時間複雜度為O(1);當訪問的資料存在於儲存的連結串列中時,將該資料對應的節點,插入到連結串列表頭,時間複雜度為O(n)。如果快取被佔滿,則從連結串列尾部的資料開始清理,時間複雜度為O(1)。
6)陣列實現LRU快取淘汰策略
方式一:首位置儲存最新訪問資料,末尾位置優先清理
當訪問的資料未存在於快取的陣列中時,直接將資料插入陣列第一個元素位置,此時陣列所有元素需要向後移動1個位置,時間複雜度為O(n);當訪問的資料存在於快取的陣列中時,查詢到資料並將其插入陣列的第一個位置,此時亦需移動陣列元素,時間複雜度為O(n)。快取用滿時,則清理掉末尾的資料,時間複雜度為O(1)。
方式二:首位置優先清理,末尾位置儲存最新訪問資料
當訪問的資料未存在於快取的陣列中時,直接將資料新增進陣列作為當前最有一個元素時間複雜度為O(1);當訪問的資料存在於快取的陣列中時,查詢到資料並將其插入當前陣列最後一個元素的位置,此時亦需移動陣列元素,時間複雜度為O(n)。快取用滿時,則清理掉陣列首位置的元素,且剩餘陣列元素需整體前移一位,時間複雜度為O(n)。(優化:清理的時候可以考慮一次性清理一定數量,從而降低清理次數,提高效能。)
2.如何通過單鏈表實現“判斷某個字串是否為水仙花字串”?(比如 上海自來水來自海上)
1)前提:字串以單個字元的形式儲存在單鏈表中。
2)遍歷連結串列,判斷字元個數是否為奇數,若為偶數,則不是。
3)將連結串列中的字元倒序儲存一份在另一個連結串列中。
4)同步遍歷2個連結串列,比較對應的字元是否相等,若相等,則是水仙花字串,否則,不是。
六、設計思想
時空替換思想:“用空間換時間” 與 “用時間換空間”
當記憶體空間充足的時候,如果我們更加追求程式碼的執行速度,我們就可以選擇空間複雜度相對較高,時間複雜度小相對較低的演算法和資料結構,快取就是空間換時間的例子。如果記憶體比較緊缺,比如程式碼跑在手機或者微控制器上,這時,就要反過來用時間換空間的思路。