02 2021 档案
摘要:KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法。 对于字符串匹配,最简单的做法是暴力法双层循环依次对比。 int search(String pat, String txt) { int M = pat.length; int N = txt.length; f
阅读全文
摘要:跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。 跳跃表支持平均 O(\log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。 在大部分情况下, 跳跃表的效率可以和平衡树相媲美, 并且因为跳跃
阅读全文
摘要:Redis 的字典使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保存了字典中的一个键值对。 typedef struct dictEntry { // 键 void *key; // 值 union { void *val; uint64_t u64; int64
阅读全文
摘要:redis里面的链表为双链表结构 /* * 双端链表节点 */ typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; } listNod
阅读全文
摘要:Redis并没有使用C语言传统的字符串,而是构建了一种名为简单动态字符串(Simple dynamic string,SDS),并作为默认字符串使用。 例如:执行如下命令 SET msg "hello world" Redis数据库中将建立一个键值对,键是一个字符串对象,是一个负责保存"msg"的S
阅读全文
摘要:链表一般分为单链表、双向链表和循环链表。 单链表:链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”,结点除了存储数据之外,还记录链表的下一个结点的地址next。 class Node{ Item item; Node next;} 其中有两个结点比较特殊,分别是第一个结
阅读全文
摘要:定义: 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 数组优点:支持随机访问,根据下标随机访问的时间复杂度为 O(1)。 数组的操作: 查找:如果数组已排序,利用二分查找,时间复杂度为logn,否则顺序查找,时间复杂度为N。 public int r
阅读全文