数据结构与算法
文章平均质量分 81
men_wen
这个作者很懒,什么都没留下…
展开
-
单链表的基本操作大全之C语言实现(一)
单链表的基本操作大全之C语言实现1. 单链表的定义链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单元可以是连续的也可以是不连续的。为了建立起数据元素之间的关系,对于每个数据元素除了存放数据元素自身的信息外,还必须有包含的指示该元素直接后继元素存储位置的信息,这两部分信息组成一个结点,即每个结点都有至少包括两个域,一个域存储数据元素信息,称为数据域,另一个域存储直接后继的地址,称为指针原创 2016-10-20 21:43:10 · 18987 阅读 · 3 评论 -
Redis源码剖析和注释(六)--- 压缩列表(ziplist)
Redis 压缩列表(ziplist)1. 介绍压缩列表(ziplist)是哈希键的底层实现之一。它是经过特殊编码的双向链表,和整数集合(intset)一样,是为了提高内存的存储效率而设计的。当保存的对象是小整数值,或者是长度较短的字符串,那么redis就会使用压缩列表来作为哈希键的实现。127.0.0.1:6379> HMSET hash name mike age 28 sex maleOK原创 2017-04-14 23:08:21 · 8036 阅读 · 3 评论 -
Redis源码剖析和注释(七)--- 快速列表(quicklist)
Redis 快速列表(quicklist)1. 介绍quicklist结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现。通过列表键查看一下:redis 列表键命令详解127.0.0.1:6379> RPUSH list 1 2 5 1000"redis" "quicklist"(integer) 127.0.0.1:6379> OBJECT ENCODING list"qui原创 2017-04-18 16:02:04 · 12198 阅读 · 4 评论 -
Redis源码剖析和注释(五)--- 整数集合(intset)
Redis 整数集合(intset)1. 介绍整数集合(intset)是集合键底层实现之一。集合键另一实现是值为空的散列表(hash table),虽然使用散列表对集合的加入删除元素,判断元素是否存在等等操作时间复杂度为O(1),但是当存储的元素是整型且元素数目较少时,如果使用散列表存储,就会比较浪费内存,因此整数集合(intset)类型因为节约内存就存在。散列表的实现在redis集合键命令:red原创 2017-04-12 17:58:04 · 3377 阅读 · 0 评论 -
Redis源码剖析和注释(四)--- 跳跃表(skiplist)
Redis 跳跃表(skiplist)1. 跳跃表(skiplist)介绍定义:跳跃表是一个有序链表,其中每个节点包含不定数量的链接,节点中的第i个链接构成的单向链表跳过含有少于i个链接的节点。跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,大部分情况下,跳跃表的效率可以和平衡树相媲美。跳跃表在redis中当数据较多时作为有序集合键的实现方式之一。接下来,还是举个有序集合键的例子原创 2017-04-10 23:27:20 · 9563 阅读 · 8 评论 -
数据结构之 AVL树(平衡二叉树)(C语言实现)
AVL树(平衡二叉树)1. AVL树定义和性质AVL(Adelson-Velskii和Landis发明者的首字母)树时带有平衡条件的二叉查找树。二叉查找树的性能分析:在一颗左右子树高度平衡情况下,最优的时间复杂度为O(log2nlog_2{n}),这与这半查找相同;在一个只有右子树的二叉树中,最差的时间复杂度会脱变为线性查找O(n)。二叉查找树的实现:二叉查找树的C语言实现由于二叉查找树存在以原创 2017-03-31 22:34:13 · 5106 阅读 · 3 评论 -
数据结构之 栈(C语言实现)
数据结构之 栈(C语言实现)1.栈的模型栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。对栈的基本操作有push(进栈)和pop(出栈),前者相当于插入,后者则是删除最后插入的元素。最后插入的元素可以通过使用top例程在执行pop之前进行考察。对空栈进行的pop或top一般被认为是栈ADT的错误。另一方面,当运行push时空间用尽是一个实现错误,但不原创 2017-03-14 23:23:20 · 19314 阅读 · 1 评论 -
数据结构之 队列(C语言实现)
数据结构之 队列(C语言实现)1. 队列ADT1.1 介绍队列(queue)属于表,使用队列时插入在一端进行而删除在另一端进行。 1.2 队列模型队列的基本操作是Enqueue(入队),它是在表的末端(队尾(rear))插入一个元素,还有Dequeue(出队),它是删除(或返回)在表的开头(队头(front))的元素。如下图:2. 队列的数组实现queue.h文件#ifndef _QUEUE_H原创 2017-03-14 09:51:58 · 8569 阅读 · 0 评论 -
Redis源码剖析和注释(三)--- Redis 字典结构
Redis 字典结构1. 介绍字典又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。例如:redis中的所有key到value的映射,就是通过字典结构维护,还有hash类型的键值。通过redis中的命令感受一下哈希键。127.0.0.1:6379> HSET user name原创 2017-04-08 21:18:06 · 5686 阅读 · 2 评论 -
Redis源码剖析和注释(二)--- 简单动态字符串
Redis 简单动态字符串1.介绍Redis兼容传统的C语言字符串类型,但没有直接使用C语言的传统的字符串(以’\0’结尾的字符数组)表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的对象。简单动态字符串在Redis数据库中应用很广泛,例如:键值对在底层就是由SDS实现的。在redis种,有一种数据类型叫string类型,而string类型简单的说就是原创 2017-04-06 16:39:29 · 6535 阅读 · 3 评论 -
数据结构之 二叉查找树(C语言实现)
数据结构之 二叉查找树1. 二叉查找树的定义二叉查找树(binary search tree)是一棵二叉树,或称为二叉搜索树,可能为空;一棵非空的二叉查找树满足一下特征:每个元素有一个关键字,并且任意两个元素的关键字都不同;因此,所有的关键字都是唯一的。在根节点的左子树中,元素的关键字(如果存在)都是小于根节点的关键字。在根节点的右子树中,元素的关键字(如果存在)都是大于根节点的关键字。根节原创 2017-03-28 20:42:07 · 7873 阅读 · 1 评论 -
数据结构之 二叉树(C语言实现)
数据结构之 二叉树(C语言实现)1. 二叉树的定义==二叉树(Binary Tree)是n(n ≥ 0)个节点有限集合。==当n=0时,称为空二叉树,当n>0时,该集合有一个根节点及互不可交的,分别被称为左子树和右子树的二叉树组成。二叉树可以被理解为一下两个条件的树型结构。每个节点度不大于2。节点没棵子树时明确区分左右的,不能随意改变。 2. 二叉树的性质在二叉树的第i层之多有2i−12^{原创 2017-03-28 20:31:29 · 18247 阅读 · 2 评论 -
单链表的基本操作大全之C语言实现(二)
单链表的基本操作大全之C语言实现(二)补充一些链表的操作,之前的基本操作点击下面的链接。 单链表的基本操作大全之C语言实现(一)1. 递归打印链表void show_linklist(PNODE *phead) { if(phead == NULL){ return; }else{ printf("%原创 2016-12-04 22:22:00 · 968 阅读 · 0 评论 -
Redis源码剖析和注释(一)---链表结构
Redis源码剖析—链表结构1. redis中的链表在redis中链表的应用非常广泛,例如列表键的底层实现之一就是链表。而且,在redis中的链表结构被实现成为双向链表,因此,在头部和尾部进行的操作就会非常快。通过列表键的命令感受一下双向链表:列表键命令详解127.0.0.1:6379> LPUSH list a b c //依次在链表头部插入a、b、c(integer) 3127.0.0原创 2017-04-04 22:08:19 · 11598 阅读 · 4 评论