摘要:
定义: 贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。 即不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。 贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性(即某个状态以后的过程不 阅读全文
摘要:
回溯法-深度优先算法 一、概述 回溯算法是把问题的解空间转化成了图或树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解和最优解。 基本思想类似于 图的深度优先搜索 二叉树的后续遍历 【分支限界法:广度优先搜索。思想类似于图的广度优先遍历。二叉树的层序遍历。】 详细描述: 阅读全文
摘要:
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 阅读全文
摘要:
红黑树是一种性能非常优秀的数据结构,关键在于它能保证最坏的性能也是对数的。红黑树的本质是一棵2-3树。 算法4里对2-3树,偏左红黑树的描述更简单和直观,比算法导论更容易理解。算法导论里实现红黑树插入删除要几百行代码,而LLRB只需要几十行。 红黑树前置准备: 2-3树定义: 2-3树的主要特点就是 阅读全文