摘要:
前言 LRU 是 Least Recently Used 的简写,字面意思是最近最少使用。 通常用于缓存的淘汰策略实现,由于缓存的内存非常宝贵,所以需要根据某种规则来剔除数据保证内存不被撑满。 代码实现 #ifndef _LRU_CACHE_H_ #define _LRU_CACHE_H_ #inc 阅读全文
摘要:
二叉树 知识点 前序遍历:先访问根节点,再前序遍历左子树,然后前序遍历右子树 中序遍历:先中序遍历左子树,再访问根节点,然后中序遍历右子树 后序遍历:先后续遍历左子树,再后续遍历右子树,然后访问根节点 注意: 以根节点访问顺序决定什么遍历 左子树都是优于右子树 前序遍历 struct TreeNod 阅读全文
摘要:
引言 二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗?实际上,只需要对链表稍加改造,就可以支持类似“二分”的查找算法。改造之后的数据结构叫作跳表。 定义 跳表是一个随机化的数据结构。它允许快速查询一个有序连续元素的数据链表。跳跃列表的 阅读全文
摘要:
下面实现几种串的基本操作,这些操作是构成串其他复杂操作的基石。因为相对简单,功能和分析的说明均在代码实现中。 /*动态分配存储结构*/ typedef struct { char *ch; int length; }Str; /*赋值操作*/ int strAssign(Str &str, char 阅读全文
摘要:
这一篇主要是根据 leveldb 实现的 布隆过滤器的简单版 #include <iostream> #include <cstring> using namespace std; #ifndef FALLTHROUGH_INTENDED #define FALLTHROUGH_INTENDED \ 阅读全文
摘要:
引子 《数学之美》介绍布隆过滤器非常经典: 在日常生活中,包括设计计算机软件时,经常要判断一个元素是否在一个集合中。比如: 在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中); 在FBI,一个嫌疑人的名字是否已经在嫌疑犯的名单上; 在网络爬虫里,一个网站是否已访问过 阅读全文
摘要:
引子 首先通过一道题来理解什么是bitmap。 题目:我有40亿个整数,再给一个新的整数,我需要判断新的整数是否在40亿个整数中,你会怎么做? 分析: 假设一个int占4个字节(32位),40个亿个整数就是160亿个字节,大概相当于16GB,假设一台计算机只有2GB内存,则16GB一次加载不完,需要 阅读全文
摘要:
前言 leveldb 是一个库,没有 main() 函数入口, 故非常难理清其中的代码逻辑。但好在库中有非常多的单元测试代码,帮助读者理解其中的各个模块的功能。然而,测试代码个人觉得一开始看时非常费解,特别是其中非常复杂的宏定义让人陷于云里雾里一般。研究 leveldb 的时间也有一段时间了,但一直 阅读全文
摘要:
斐波那契数列定义 Fibonacci array:1,1,2,3,5,8,13,21,34,... 在数学上,斐波那契数列是以递归的方法来定义: F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2) 用文字描述,就是斐波那契数列由0和1开始,之后的斐波那契系数就是由之前的 阅读全文
摘要:
前言 最近研究一个工具库需要用 jemalloc 做内存分配器,但在 ubuntu 下安装过程中遇到很多问题,故记下安装过程的笔记,避免以后遇到在这上面浪费时间。 安装过程 环境:VMware Ubuntu 18.04.3 LTS cd ~/桌面 wget https://github.com/je 阅读全文