前几节学习了「链表」、「时间与空间复杂度」的概念,本节将结合「循环链表」、「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存淘汰算法。 三种最常见的链表结构 循环链表的概念 如上图所示:单链表的尾结点指针指向空地址,表示这就是最后的结点了。而循环链表的尾结点指针是 ...
分类:
编程语言 时间:
2018-12-24 16:25:52
阅读次数:
179
上一篇用链表实现了stack,这篇我们采用数组来存储数据,数组更容易理解,直接贴代码 第一、代码实现 1 #pragma once 2 #include <iostream> 3 using namespace std; 4 template <typename T> class StackArra ...
分类:
编程语言 时间:
2018-12-23 11:06:37
阅读次数:
196
第一、基本概念 栈中的元素遵守“先进后出”的原则(LIFO,Last In First Out) 只能在栈顶进行插入和删除操作 压栈(或推入、进栈)即push,将数据放入栈顶并将栈顶指针加一 出栈(或弹出)即pop,将数据从栈顶删除并将栈顶指针减一 栈的基本操作有:pop,push,判断空,获取栈顶 ...
分类:
编程语言 时间:
2018-12-23 00:18:12
阅读次数:
242
今天不瘦给大家分享一下redis第二个基本数据类型:列表。如果大家了解基本数据结构,相信大家对列表不会陌生,比如在C语言中我们可以使用数组实现一个列表,也可以使用链表实现一个列表(列表链表傻傻分不清楚,列表是一种抽象数据类型,链表为一种实现方式)。 言归正传,那redis是怎么实现列表的呢?答案是: ...
分类:
其他好文 时间:
2018-12-20 00:00:52
阅读次数:
236
0.目录 1. "双向循环链表的实现" 2. "小结" 1.双向循环链表的实现 本节目标: 使用 Linux 内核链表实现 StLib 中的双向循环链表 template typename T class DualCircleList; StLib 中双向循环链表的设计思路: 数据结点之间在逻辑上构 ...
分类:
其他好文 时间:
2018-12-18 17:57:19
阅读次数:
146
HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 初始size为11,扩容:newsize = olesize*2+1 计算index的方法: ...
分类:
其他好文 时间:
2018-12-17 02:37:24
阅读次数:
237
1 public class Main { 2 3 // 就地逆序法 4 public Node reverse(Node head) { 5 // no need to reverse 6 if (head == null || head.next == null || head.next.nex... ...
分类:
其他好文 时间:
2018-12-01 23:45:41
阅读次数:
174
基于链表的队列 当我们基于链表实现队列时,需要从一端加元素,另一端取出元素,就需要引入一个新的变量tail指向链表的尾部,此时,向尾部进行添加操作时间复杂度会变为O(1),然而删除操作还是需要从head向后遍历,所以此时选择链表尾为队尾,链表头为队首。 基于链表的实现的源码如下: package q ...
分类:
其他好文 时间:
2018-11-25 21:16:17
阅读次数:
157
一、LinkedList结构 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的。 LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 Li ...
分类:
编程语言 时间:
2018-11-24 00:52:37
阅读次数:
331