从链表出发封装一个自己的工具

这个是第一篇, 说一下前提; 

前些时候用到cache的时候用到了YYCache来做缓存, 然后里面提到了一个缓存算法LRU, 然后缓存算法常见的有LFU、LRU、ARC、FIFO、MRU(百度百科); 其中LRU称为 "最近最少使用算法",这里的增删主要使用链表来实现, 因为链表的增删都是O(1),(写到这里很慌, 希望没有说错, 不要被打脸)

这里有点模糊, 所以来重新复习一下数据结构以及算法, 都是实用的, 首先我找的资料呢是<<算法第四版>>, 这个是java实现的 然后参考了一下其他资料. 好的作为一个iOS开发人员, 我们首先来看一下链表的swift怎么实现

第一我们来实现一下链表

链表的swift实现

好了, 这里说几点, 第一这里的链表是使用类来实现的, 并不是用结构体,里面不能用存储属性, 而每一个节点我们都是这种存储属性, 这个用引用类型实现会比较好. 所以这里选择的是类, 而不是结构体.

第二步 我们用这个链表来实现一些基础的数据结构栈和队列和背包

栈的链表实现

队列的链表实现

背包的链表实现

大家注意到, 用链表可以很方便的实现栈和队列, 这里用数组也可以实现同样的功能,具体的区别在于对应的操作的效率,大家可以自己对比一下, 我还是比较推荐用链表实现, 因为主要是增删的操作对于链表是O(1), 对于数组是O(n)

在构建这几个基本的数据结构的时候呢, 用到了swift中关于迭代器和对列的相关协议.让链表可以像数组一样用forin循环进行操作, 并且提供了快捷的构建方法, 通过数组和字面量的两种形式

LRU算法: Least recently used,最近最少使用. 这个淘汰算法是指将最近访问过的数据插到最前面, 当超过限制之后从最后面删除数据.好吧, 现在我们来用链表来实现这个算法, 并且做一个能使在实际项目使用到的工具.

RLU算法的链表实现

这里的算法实现也是通过包装链表的一些列方法来实现的, 这里需要讨论的问题是, 那么为什么不直接用链表来实现这些功能而是用一个协议来实现, 这就是为了更好封装性和安全性, 确保在这个算法里面没有冗余的方法和不可预测错误使用方式, 所以基于链表的这一系列的实现(包括上面的栈, 队列, 以及背包和RLU算法)都是通过包装链表已有的方法进行的实现, 同时这个协议的实现也提供了一种可能性, 就是如果有不同的想法, 比如我想用一个数组来实现一个栈, 也可以通过这个协议指定的规范来统一实现相应的方法就行了. 同时需要说明的是,协议不代表你实现了这个协议就一定是实现了这样的功能, 因为你可能实现了相同的方法但是逻辑并不是这么回事, 所以协议仅仅只是一个规范, 遵守规范还是需要人为把控.

这里要提一下就是要实现线程安全或者说是原子操作, 目前在iOS里面有来之pthread的锁(自旋锁, 互斥锁),以及GCD的信号量, barrier,以及iOS10提出的unfair_lock等, 上面提到的都是比较典型的. 然后这里要提醒一下的是自旋锁和信号量在iOS平台都是不安全的方式.具体的大家可以搜索一下很容易就能明白(不愿意搜索的我简单提一下, 是由于优先级的问题造成了无法unlock). 综合很多资料比较性能之后选用的是互斥锁, 并且选用了一个比较优的封装方案(避免了闭包捕获带来的额外开销, 以及swift对于inline的优化)

互斥锁以及unfair_lock的封装

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 这次来澳洲,被分配到了著名的大Doncaster,有着号称澳洲第二大的shopping center--Donca...
    Mr_Hap阅读 1,245评论 0 48
  • 大早上第一节英语课,我大概是疯了,下着雨,打着伞,提着包,踩着高跟鞋,走了40分钟找到教室,毫无疑问,迟到了。我算...
    不一样的烟火sss阅读 176评论 0 0
  • 1,用心去感知世界,感受世界的跳动,去与它们产生联系,产生共鸣,向万物学习! 2,科技再进步,也取代不了人与人的亲...
    橘子侠阅读 140评论 0 0
  • 我们现在几乎24小时都在接收各种商家的文案信息,知识博主们也在向你灌输不会写互联网文案的你正在失去职场竞争力。我们...
    清淡叽阅读 4,197评论 0 2