從連結串列出發封裝一個自己的工具
這個是第一篇, 說一下前提;
前些時候用到cache的時候用到了YYCache來做快取, 然後裡面提到了一個快取演算法LRU, 然後快取演算法常見的有LFU、LRU、ARC、FIFO、MRU(百度百科); 其中LRU稱為 "最近最少使用演算法",這裡的增刪主要使用連結串列來實現, 因為連結串列的增刪都是O(1),(寫到這裡很慌, 希望沒有說錯, 不要被打臉)
這裡有點模糊, 所以來重新複習一下資料結構以及演算法, 都是實用的, 首先我找的資料呢是<<演算法第四版>>, 這個是java實現的 然後參考了一下其他資料. 好的作為一個iOS開發人員, 我們首先來看一下連結串列的swift怎麼實現
第一我們來實現一下連結串列
好了, 這裡說幾點, 第一這裡的連結串列是使用類來實現的, 並不是用結構體,裡面不能用儲存屬性, 而每一個節點我們都是這種儲存屬性, 這個用引用型別實現會比較好. 所以這裡選擇的是類, 而不是結構體.
第二步 我們用這個連結串列來實現一些基礎的資料結構棧和佇列和揹包
大家注意到, 用連結串列可以很方便的實現棧和佇列, 這裡用陣列也可以實現同樣的功能,具體的區別在於對應的操作的效率,大家可以自己對比一下, 我還是比較推薦用連結串列實現, 因為主要是增刪的操作對於連結串列是O(1), 對於陣列是O(n)
在構建這幾個基本的資料結構的時候呢, 用到了swift中關於迭代器和對列的相關協議.讓連結串列可以像陣列一樣用forin迴圈進行操作, 並且提供了快捷的構建方法, 通過陣列和字面量的兩種形式
LRU演算法: Least recently used,最近最少使用. 這個淘汰演算法是指將最近訪問過的資料插到最前面, 當超過限制之後從最後面刪除資料.好吧, 現在我們來用連結串列來實現這個演算法, 並且做一個能使在實際專案使用到的工具.
這裡的演算法實現也是通過包裝連結串列的一些列方法來實現的, 這裡需要討論的問題是, 那麼為什麼不直接用連結串列來實現這些功能而是用一個協議來實現, 這就是為了更好封裝性和安全性, 確保在這個演算法裡面沒有冗餘的方法和不可預測錯誤使用方式, 所以基於連結串列的這一系列的實現(包括上面的棧, 佇列, 以及揹包和RLU演算法)都是通過包裝連結串列已有的方法進行的實現, 同時這個協議的實現也提供了一種可能性, 就是如果有不同的想法, 比如我想用一個陣列來實現一個棧, 也可以通過這個協議指定的規範來統一實現相應的方法就行了. 同時需要說明的是,協議不代表你實現了這個協議就一定是實現了這樣的功能, 因為你可能實現了相同的方法但是邏輯並不是這麼回事, 所以協議僅僅只是一個規範, 遵守規範還是需要人為把控.
這裡要提一下就是要實現執行緒安全或者說是原子操作, 目前在iOS裡面有來之pthread的鎖(自旋鎖, 互斥鎖),以及GCD的訊號量, barrier,以及iOS10提出的unfair_lock等, 上面提到的都是比較典型的. 然後這裡要提醒一下的是自旋鎖和訊號量在iOS平臺都是不安全的方式.具體的大家可以搜尋一下很容易就能明白(不願意搜尋的我簡單提一下, 是由於優先順序的問題造成了無法unlock). 綜合很多資料比較效能之後選用的是互斥鎖, 並且選用了一個比較優的封裝方案(避免了閉包捕獲帶來的額外開銷, 以及swift對於inline的優化)
相關文章
- 封裝一個自己的js庫封裝JS
- 分享個自己封裝的限流trait封裝AI
- 淺析jQuery原理並仿寫封裝一個自己的庫jQuery封裝
- 自己封裝的一些業務小元件封裝元件
- 自己實現一個 DFA 串模式識別器(一)模式
- 前端開發 通用JS工具的封裝前端JS封裝
- 封裝一個通用的PopupWindow封裝
- 如何自己開發一個腳手架工具
- 統一結果封裝封裝
- [CSR8] 分享一個CSR8670串列埠收發程式 [複製連結]串列埠
- C++ 多個類的 DLL 封裝以及隱式連結和顯式連結 2 種方法呼叫C++封裝
- 基於Docker封裝的開發包工具Docker封裝
- 自己開發的一個SAP CRM訂單統計工具
- 自己實現一個 DFA 串模式識別器(二)模式
- 一個簡單的 Amqp 封裝MQ封裝
- 06從一個例項看資料抽象與封裝抽象封裝
- 手把手教你封裝自己的圖片快取工具-ImageLoader封裝快取
- vue通俗易懂封裝一個樹元件?(複製貼上就是自己的了?)Vue封裝元件
- 一次依賴注入不慎引發的一連串事故依賴注入
- 自己封裝的一個 servlet 和 applet 序列化通訊的好例子封裝ServletAPP
- 8.7 一個模組的封裝過程封裝
- Android 封裝一個通用的PopupWindowAndroid封裝
- 一款可以連結DevOps的敏捷開發工具dev敏捷
- 用promise封裝一個ajaxPromise封裝
- 使用ts封裝一個ajax封裝
- 開發一個自己的 CSS 框架(一)CSS框架
- 一次Android動畫工具類的封裝Android動畫封裝
- 從零開發一個node命令列工具命令列
- 三分鐘搭建一個自己的 ChatGPT (從開發到上線)ChatGPT
- AFN3.0封裝一層工具類封裝
- 我自己的Javascript 庫,封裝了一些常用函式JavaScript封裝函式
- 如何開發一個自己的 RubyGem?
- 【JavaScript框架封裝】實現一個類似於JQuery的動畫框架的封裝JavaScript框架封裝jQuery動畫
- 自己動手封裝js工具類(JS中定義類的幾種方式)封裝JS
- 開源自己用python封裝的一個Windows GUI(UI Automation)自動化工具,支援MFC,Windows Forms,WPF,Metro,QtPython封裝WindowsGUIORMQT
- 寫一個有字元介面的ssh連結工具字元
- 從 app 開啟一個連結 www.baidu.com,如何獲取該連結的 url?APPAI
- Android架構系列-封裝自己的okhttpAndroid架構封裝HTTP