
算法/数据结构
文章平均质量分 84
jlaij
这个作者很懒,什么都没留下…
展开
-
Redis数据结构实现分析
面试中,redis也是很受面试官亲睐的一部分。我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构。你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap、List、等使用的数据结构有什么区别呢。1. 字符串处理(string)我们都知道redis是用C语言写,但是C语言处理字符串和数组的成本是很高的,下面我分别说几个例子。没有数据结构支撑的...转载 2019-10-19 01:54:33 · 137 阅读 · 0 评论 -
c++实现skip list
编程实例:#include #include #include #include #include #define maxLevel 12struct Node{ int key; int value; Node* forward[1];};struct skipList{ int level; Node* head;};class SkipList{原创 2015-12-09 17:20:02 · 1011 阅读 · 1 评论 -
c++实现Bloom Filter
Bloom Filter(BF) 是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法,用于快速查找某个元素是否属于集合, 但不要求百分百的准确率。 Bloom filter通常用于爬虫的url去重,即判断某个url是否已经被爬过。 为了说明Bloom Filter存在的重要意义,举一个实例: 假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接原创 2015-10-15 09:43:29 · 2248 阅读 · 5 评论 -
leveldb源码中变长编码代码
leveldb中编码代码:#include #include #include #include typedef signed char int8_t;typedef signed short int16_t;typedef signed int int32_t;typedef signed long long原创 2015-10-14 15:37:11 · 1059 阅读 · 0 评论 -
LevelDB原理探究与代码分析
1. 概述Level DB(http://code.google.com/p/leveldb/)是google开源的Key/Value存储系统,它的committer阵容相当强大,基本上是bigtable的原班人马,包括像jeff dean这样的大牛,它的代码合设计非常具有借鉴意义,是一种典型的LSM Tree的KV引擎的实现,从它的数据结构来看,基本就是sstable的开源实现,而且转载 2015-10-09 10:47:04 · 672 阅读 · 0 评论 -
leveldb抽取写文件代码
抽取代码:#include #include #include #include #include #include #include #include using namespace std;class WriteFile{public: char *base, *limit, *dst; size_t pagesize, mapsize; int fd; u原创 2015-10-20 10:06:23 · 528 阅读 · 0 评论 -
胜者树与败者树
胜者树与败者树 胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。 不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。 胜者树与败者树可以在log(n)的时间内找到最值。任何一个叶子结点的值转载 2015-09-29 10:58:07 · 597 阅读 · 1 评论 -
google的levelDB实现原理分析
LevelDb日知录之一:LevelDb 101 说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat。这两位是Google公司重量级的工程师,为数甚少的Google Fellow之二。 Jeff Dean其人:http://research转载 2015-09-28 15:44:26 · 566 阅读 · 0 评论 -
实现平衡二叉树
平衡二叉树主要涉及四种情况:左左、右右、左右、右左四种调整左左时://进行左旋TreeNode* AvlTree::singleLeft(TreeNode* node1){ TreeNode* node2 = node1->lson; node1->lson = node2->rson; node2->rson = node1; return node2;}右右:原创 2015-08-13 14:41:16 · 464 阅读 · 0 评论 -
Redis之小端转大端
redis的Endianconv.c文件主要服务于inset集合升级,其实看以看出它是做了个转换,将小端转成大端的方法#include /* Toggle the 16 bit unsigned integer pointed by *p from little endian to * big endian */void memrev16(void *p) { unsign原创 2015-08-12 16:36:54 · 1538 阅读 · 0 评论 -
Redis 的跳跃表实现
Redis 的跳跃表由 redis.h/zskiplistNode 和 redis.h/zskiplist 两个结构定义, 其中 zskiplistNode 结构用于表示跳跃表节点, 而zskiplist 结构则用于保存跳跃表节点的相关信息, 比如节点的数量, 以及指向表头节点和表尾节点的指针, 等等。 header | tail | level \n 5 | length \n转载 2015-08-12 09:23:23 · 489 阅读 · 0 评论 -
Redis之双链表
Redis数据结构大量使用双链表,实现在Adlist.h、Adlist.c文件中双链表结构定义:链表节点typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;链表typedef struct list { l原创 2015-08-12 11:22:08 · 533 阅读 · 0 评论 -
跳跃表解析
为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前原创 2015-08-12 09:12:48 · 694 阅读 · 0 评论 -
Linux内存管理 Slab分配器
采用伙伴算法分配内存时,每次至少分配一个页面。但当请求分配的内存大小为几十个字节或几百个字节时应该如何处理?如何在一个页面中分配小的内存区,小内存区的分配所产生的内碎片又如何解决?Linux采用Slab。Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例转载 2015-06-23 16:18:29 · 614 阅读 · 0 评论 -
RabbitMQ的几种应用场景
官网地址:http://www.rabbitmq.com/getstarted.htmlRabbitMQ是一个消息代理,从“生产者”接收消息并传递消息至“消费者”,期间可根据规则路由、缓存、持久化消息。“生产者”也即message发送者以下简称P,相对应的“消费者”乃message接收者以下简称C,message通过queue由P到C,queue存在于RabbitMQ,可存储尽可能多的转载 2015-12-11 17:42:58 · 1453 阅读 · 0 评论 -
Paxos算法细节详解(一)--通过现实世界描述算法
Paxos分析最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bitbucket.org/sciascid/libpaxos 下载。对paxos算法有初步了解之后,再看此文的效果会更好;如果你也想分析libpaxos3的话,此文应该会对你有不小帮助;关于paxo转载 2015-11-02 14:36:47 · 689 阅读 · 0 评论 -
lzw字符串压缩算法实现
lzw算法思想举例:原输入数据为:A B A B A B A B B B A B A B A A C D A C D A D C A B A A A B A B .....采用LZW算法对其进行压缩,压缩过程用一个表来表述为:注意原数据中只包含4个character,A,B,C,D用两bit即可表述,根据lzw算法,首先扩展一位变为3为,Clear=2的2次方+1=4; End原创 2015-10-15 15:08:10 · 4955 阅读 · 0 评论 -
c++实现mysql数据库数据缓存
主要是将mysql数据库数据缓存到内存,可以读取某一行数据,封装mysql-c-connector具体代码位置:https://github.com/Addision/mysql_cpp_cache原创 2016-04-18 15:38:57 · 2340 阅读 · 0 评论 -
构建对等网DHT网络中的Chord算法介绍
Chord是最简单,最精确的环形P2P模型。“Chord”这个单词在英文中是指“弦”,在分布式系统中指“带弦环”,在P2P领域则指基于带弦环拓扑结构的分布式散列表(DHT)或者构建与其上的P2P网络。虽然MIT和UC Berkeley的研究早在2001年之前就开发了Chord及其应用系统,但有关Chord的正式论文[Stoica et al., 2001]发表在计算机通信领域著名会议ACM SIG转载 2016-04-11 11:21:22 · 1813 阅读 · 0 评论 -
Bitcask存储模型
----《大规模分布式存储系统:原理解析与架构实战》读书笔记最近一直在分析OceanBase的源码,恰巧碰到了OceanBase的核心开发者的新作《大规模分布式存储系统:原理解析与架构实战》.看完样章后决定入手,果然物有所值。对于准备学习分布式的同学,这是一本不错的书籍,相对系统,全面的介绍了分布式的相关技术和项目,基本都是干货。还有一半是在介绍OceanBase的内容,对我来说,正是转载 2015-12-08 16:01:43 · 625 阅读 · 0 评论 -
c++实现数据缓存(包含存储定长变长整数)
编程实例:CDataBuffer.h#include #include #include #include // typedef signed char int8_t; // typedef signed short int16_t; // typedef signed int int32_t; // typ原创 2015-12-08 15:00:14 · 4014 阅读 · 0 评论 -
c++/c实现线程池
编程实例:CThreadPool.h#include #include #include #include #include #include typedef void*(*FunPtr)(void* arg);class CThreadPool;typedef struct worker{ pthread_t pid; FunPtr fun_cb; vo原创 2015-12-04 09:29:10 · 902 阅读 · 0 评论 -
简单LRU算法实现的Cache(C++)
#pragma once#include #include templateclass LRUCache{public: LRUCache(void); LRUCache(int capacity); ~LRUCache(void); void Put(const CacheKey & key, const CacheValue & value); bool Get(cons转载 2015-12-02 14:51:35 · 630 阅读 · 0 评论 -
map/reduce工作原理
说明:下面的图来自南京大学计算机系黄宜华老师开设的mapreduce课程的课件,这里稍作整理和 总结。本文旨在对接触了mapreduce之后,但是对mapreduce的工作流程仍不是很清楚的人员,当然包括博主自己,希望与大家一起学习。mapreduce的原理MapReduce借鉴了函数式程序设计语言Lisp中的思想,Lisp(List processing)是一种列转载 2015-12-01 14:16:52 · 2690 阅读 · 0 评论 -
淘宝tair网络处理机制
Tbnet EPollSocketEvent:注册/移除网络事件,同时获取网络事件。通过epoll_event中的data.ptr来指向该事件对应的IOComponent TcpAcceptor:处理监听端口的读请求,获取新连接组装成TCPComponent并add给tranport。TcpAcceptor是继承于IOComponent。 ChannelPool:管原创 2015-12-01 15:31:10 · 958 阅读 · 0 评论 -
mmseg分词算法
MMSeg算法说明首先来理解一下chunk,它是MMSeg分词算法中一个关键的概念。Chunk中包含依据上下文分出的一组词和相关的属性,包括长度(Length)、平均长度(Average Length)、标准差的平方(Variance)和自由语素度(Degree Of Morphemic Freedom)。下面列出了这4个属性:属性含义长度(Length)转载 2015-11-30 17:16:45 · 490 阅读 · 0 评论 -
LSM树存储模型
----《大规模分布式存储系统:原理解析与架构实战》读书笔记之前研究了Bitcask存储模型,今天来看看LSM存储模型,两者虽然同属于基于键值的日志型存储模型。但是Bitcask使用哈希表建立索引,而LSM使用跳跃表建立索引。这一差别导致了两个存储系统的构造出现明显的分化。为此,我还先去捣腾了一番跳跃表的实现.今天算是进入了正题。LSM的结构LSM的基本思想是将转载 2015-12-15 16:59:28 · 615 阅读 · 0 评论 -
c++实现半同步半异步I/O的设计模式(half sync/half async)
半同步半异步I/O的设计模式(half sync/half async)1.动机:众所周知,同步模式编程简单,但是I/O的利用利率低;而异步模式编程复杂,但是I/O利用率高。综合同步异步的有优点,就有了半同步半异步的设计模式。这个模式中,高层使用同步I/O模型,简化编程。低层使用异步I/O模型,高效执行。half sync/half async可以很好的使得原创 2015-12-15 16:05:03 · 1460 阅读 · 0 评论 -
c++实现hashtable缓存
编程实例:#include #include #include #include #include using namespace std;typedef unsigned int uint32_t;uint32_t DecodeFixed32(const char* data){ uint32_t res; memcpy(&res, data, sizeof(res))原创 2015-12-11 15:51:11 · 895 阅读 · 0 评论 -
埃拉托色尼选筛法
埃拉托色尼选筛法:(1)先把1删除(现今数学界1既不是质数也不是合数)(2)读取队列中当前最小的数2,然后把2的倍数删去(3)读取队列中当前最小的数3,然后把3的倍数删去(4)读取队列中当前最小的数5,然后把5的倍数删去(5)如上所述直到需求的范围内所有的数均删除或读取实例:#include #include using namespace st原创 2015-05-28 23:06:14 · 1745 阅读 · 0 评论 -
堆建立及堆排序
实例:#include #include using namespace std;void shiftdown(int *a, int i, int n){ int j, temp; temp = a[i]; j = 2 * i + 1; while (j < n) { if (j + 1 < n && a[j原创 2015-05-14 09:03:15 · 486 阅读 · 0 评论 -
队列的数据结构定义及算法
顺序队列的定义typedef struct{ int data[maxSIZE]; int front, rear; }SqQueue;循环队列的操作(1)两状态队列为空:qu.rear == qu.front队列为满:(qu.rear+1)%maxSIZE == qu.front(2)两操作元素X进队qu.rear=(qu.rear+1)%maxS原创 2013-04-16 15:16:17 · 1157 阅读 · 0 评论 -
c语言实现创建链表
利用尾插法创建链表#include#include//定义链表节点struct Node{ int data; struct Node *next;}node;int main(){ struct Node *head, *pt, *p; head = pt = (struct Node *)malloc(sizeof(node)); scanf("%d",&pt-原创 2013-04-16 11:34:42 · 6750 阅读 · 0 评论 -
c语言实现二叉树及前中后序遍历
c语言实现二叉树及前中后序遍历(采用递归遍历方式)#include#include#include//定义二叉树节点typedef struct BTNode{ char data; struct BTNode *rchild,*lchild;}BTNode,*BTtree;BTtree createBTNode(BTtree ptr, char value, cha原创 2013-04-09 20:21:28 · 3316 阅读 · 0 评论 -
二叉树层次遍历
二叉树利用队列按层次遍历算法如下:void levelorder(BTNode *p){ int front,rear; BTNode *que[maxsize]; front = rear = 0; //构造循环队列 BTNode *q; if(p != NULL){ rear = (rear+1)%maxsize; que[rear] = p; whil原创 2013-04-09 20:46:34 · 1028 阅读 · 1 评论 -
求解二叉树的深度
简单求解二叉树的深度算法(二叉树以链表形式存储)int getdepth(BTNode *p){int LD,RD;if(p == NULL){return 0;}else{LD = getdepth(p->lchild);RD = getdepth(p->rchild);return (LD>RD?LD:RD)+1;}}原创 2013-04-09 20:34:50 · 849 阅读 · 0 评论 -
查找字符串中第一个不重复的字符
查找字符串中第一个不重复的字符一般有三种方法实现:1、先对字符串排序然后一次对比查找2、使用flag数组作标记3、使用hash数组以下代码是第三种方法实现:#include#include#define MAX_SIZE 50int main(){ int i,loc; char *str = "aabccbdeffe"; int len = strlen(str原创 2013-04-03 19:19:40 · 1973 阅读 · 0 评论 -
插入排序
简单实现的插入排序#include#define LEN 5int a[LEN] = { 10, 5, 3, 9, 7};void insertion_sort(){ int i, j, key; for(j = 1;j < LEN; j++){ key = a[j]; i = j - 1; while原创 2013-04-02 20:27:16 · 509 阅读 · 0 评论 -
快排序
简单实现快排序#includevoid quicksort(int a[],int s,int e){ //从a[s]到a[e]进行排序 int tmp; int i=s,j=e; if(s<e){ tmp = a[s]; while(i!=j){ while(itmp) --j; if(i<j){ a[i] = a[j]; ++i;原创 2013-04-02 20:30:11 · 603 阅读 · 0 评论 -
判断回文字符串
简单判断字符串是否为回文字符串 #include#includeint find(char *str,int n){ if(n<=1) return 1; else if(str[0] == str[n-1]) return find(str+1,n-2); else return 0;}int main(int argc, char* argv[]) {原创 2013-04-02 20:16:48 · 721 阅读 · 0 评论