一道数据结构相关的题,请教一下站里的大神们
資深大佬 : fxybk 7
小弟本人是前端,最近被问到一道数据结构的题
实现一个 new Cache(length)来存储数据,要求实现 get(key)和 set(key,data)这两个方法,重点,要考虑性能(优先考虑 get 的性能)
小弟不才,实现的时候不知道要从哪方面去体现性能优化,请教一下各位大神
大佬有話說 (12)
小弟本人是前端,最近被问到一道数据结构的题
实现一个 new Cache(length)来存储数据,要求实现 get(key)和 set(key,data)这两个方法,重点,要考虑性能(优先考虑 get 的性能)
在没有特殊技巧的前提下,如果侧重速度,选用哈希表 /树来储存 key-value 应该平均下来最快的了。
如果有特殊技巧,比如:最近用过的数据接下来被使用的几率更高这种规律下,如果频繁的进行查找最近用过的几个数据,那么队列的实现会快一丢丢(因为虽然有 2 ^ 20 个数据,但你查来查去只查前面几个,那当然容易啊)
而且“最近用过的数据接下来被使用的几率更高”这种规律其实只是像算力“摩尔定律”一样只是人为粗略的概括起来的一种规律,实际效果比较玄学,如果不是空间很有限的话,我认为根本没必要使用严格的 LRU 实现,直接使用自带的哈希表存下来就可以了;而使用如(链表+哈希表)来实现的 LRU 其实就是用链表来占据“最近用过的数据接下来被使用的几率更高”的优势,除了用哈希表来查找之外,链表可以加速排在前面的项的查找,并且方便把久远没用的数据丢掉来减小空间占用
综上:如果想要实现简单,直接用语言自带的哈希表走起,不过这太简单了,估计不是人家想考的,如果要实现 LRU 的话,最好是用链表+哈希表,用哈希表来找具体位置,关于规律的部分就是把最新用的数据排到最前面,每次查找完就把这个数据放到最前排就可以了