数据结构

redis源码之压缩列表ziplist

谁说我不能喝 提交于 2020-02-07 09:59:08
压缩列表ziplist 1.简介 连续,无序的数据结构。压缩列表是 Redis 为了节约内存而开发的, 由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。 2.组成 属性 类型 长度 用途 zlbytes uint_32t 4B 记录整个压缩列表占用的内存字节数:在对压缩列表进行内存重分配, 或者计算 zlend的位置时使用 zltail uint_32t 4B 记录压缩列表表尾节点距离压缩列表的起始地址有多少字节:通过这个偏移量,程序无须遍历整个压缩列表就可以确定表尾节点的地址。 zllen uint_16t 2B 记录了压缩列表包含的节点数量: 当这个属性的值小于UINT16_ MAX (65535)时, 这个属性的值就是压缩列表包含节点的数量; 当这个值等于 UINT16_MAX 时, 节点的真实数量需要遍历整个压缩列表才能计算得出。 entryX 列表节点 不定 压缩列表包含的各个节点,节点的长度由节点保存的内容决定。 zlend uint_8t 1B 特殊值 0xFF (十进制 255 ),用于标记压缩列表的末端。 3.压缩列表节点的构成 一个压缩列表可以包含任意多个节点(entry), 每个节点可以保存一个字节数组或者一个整数值(小整数值或者长度比较短的字符串)。 (1)节点的 previous_entry_length 属性以字节为单位,

数据结构学习分享

点点圈 提交于 2020-02-07 09:43:31
数据结构学习分享 本人大一新生,最近在自学数据结构,写博客监督自己的学习成果.所以我怀着沉重的心情开始写博客。刚开始不怎么会用这个编译器,还请各位前辈大佬多多包含,多多指导。 我们从链表开始分享,首先,是链表的创建。 1.链表的创建 话不多说先上代码。 struct list //链表的结构体 { int num ; struct list * next ; } ; struct list * create ( int n ) //这里的n用来存储链表的长度; { int i ; struct list * p ; struct list * head ; p = head = ( struct list * ) malloc ( sizeof ( struct list ) ) ; //首先创键head节点,p节点。 for ( i = 0 ; i < n ; i ++ ) //循环用来输入数据 { struct list * s = ( struct list * ) malloc ( sizeof ( struct list ) ) ; /*一个临时节点s*/ s -> num = i ; //我们这里为了方便,直接将i的值赋值给节点,在实际的创建中,可以在这里用scanf输入数据 p -> next = s ; //将p连接上s p = s ; //然后p再到s上 } p

JAVA数据结构——单链表

一个人想着一个人 提交于 2020-02-07 07:21:30
链表: 一、 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性: 1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间。并把原有的数据元素复制进新的存储空间。 2. 因为顺序表要求数据的存储位置不仅是逻辑上相邻而且物理存储上也要相邻,所以当对数据进行增删操作的时候则会引起平均一半的数据元素移动。 综上所述:适合静态存储、对数据元素很少增删操作,则优先选择顺序表,对需要对数据频繁执行插入和删除操作,则选择动态的线性表-链表,链式存储不需要逻辑上相邻的元 素物理上也相邻,所以链表也带来了一定的局限性,失去了随机存取的特点。所以根据需求进行选择。 二、使用JAVA实现单链表: 接口同顺序表: [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package com.usts.edu.list; /** * Created by Guanzhong Hu * Date :2019/12/27 * Description : 线性表 * Version :1.0 */ public interface Ilist { //

数据结构——归并排序

孤街浪徒 提交于 2020-02-07 05:29:32
归并排序 一:归并排序基本介绍 归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法是指将问题先进行划分,划分成一些小问题,然后在家进行递归求解,而治的阶段则是将分的阶段得到的各答案“修补”在一起,即分而治之)。 二:规避给排序思想示意图 归并排序先将待排序的数组进行划分,如图数组[8,4,5,7,1,3,6,2],当进行完划分之后会变成8,4,5,7,1,3,6,2单个数据。然后在进行 治 操作,整个过程会执行array.length-1次合并操作。 在治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中最后一次合并,将[4,5,7,8],[1,2,3,6]两个数组进行合并,合并成最终的 [1,2,3,4,5,6,7,8],实现步骤如下: 三:代码 package 排序算法 ; /* 归并排序 */ import java . text . SimpleDateFormat ; import java . util . Date ; public class MergetSort { public static void main ( String [ ] args ) { // int[] array = {8,4,5,7,1,3,6,2}; int [ ] array = new int [ 80000 ] ; for ( int i =

[数据结构与算法]第6章 递归

偶尔善良 提交于 2020-02-07 02:28:41
个人博客文章地址 文章目录 6.1 递归需要遵守的重要规则 6.2 递归-迷宫问题 6.3 递归-八皇后问题(回溯算法) 6.1 递归需要遵守的重要规则 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响, 比如n变量 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据. 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:) 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。 6.2 递归-迷宫问题 说明: 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关 再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化 测试回溯现象 思考: 如何求出最短路径? 代码实现: public class MiGong { public static void main ( String [ ] args ) { // 先创建一个二维数组,模拟迷宫 // 地图 int [ ] [ ] map = new int [ 8 ] [ 7 ] ; // 使用1 表示墙 // 上下全部置为1 for ( int i = 0 ; i < 7 ; i ++ ) { map

万门大学数据结构与算法进阶(1)介绍

◇◆丶佛笑我妖孽 提交于 2020-02-07 02:03:48
目录 课程安排 算法分析 运行时间(时间复杂度) 评估算法运行时间 近似记法 主项定理 P与NP 主定理 课程安排 算法分析 运行时间(时间复杂度) 评估算法运行时间 近似记法 big - o :上界 big - θ :上下界 big - Ω:下界 主项定理 P与NP Polynomial 多项式类问题 Non-Deterministic Polynomial 非确定多项式问题 主定理 来源: CSDN 作者: Robin_Pi 链接: https://blog.csdn.net/Robin_Pi/article/details/104199889

浅谈如何学习数据结构与算法[@初学者]

自闭症网瘾萝莉.ら 提交于 2020-02-07 01:57:52
导语 所谓“数据结构”,一般来说是“数据结构与算法”,是NOIPer/NOIer、本科生、硕士生、程序员都会学的一门课程,是程序员的必修课。 数据结构为什么要学? 我们使用计算机,希望它能帮助我们解决各种各样的问题,但随着发展—— 我们希望它运行得更快, 希望它能处理更多数据,希望它做一些原本不可能的事情…… 计算机科学不断改变着这个世界,但代价可能是高昂的。 好的算法设计可以做得更好,而且可能很便宜;劣质的算法就不得不花费更高昂的代价。 事实上,我们可能认为提高算力就能忽略劣质算法的影响。诚然,我们也在努力提高计算机算力,但即使强如超级计算机,也无法挽救一个错误的算法。 希望很多人能正视这个问题,因为数据结构与算法真的值得学习。 学科基础 学习数据结构与算法不需要太多的基础知识,但需要你熟练掌握一门编程语言。 至少给你C/C++/Java/Python的代码你能看得懂,让你用自己熟练的编程语言能轻松实现,这样就很棒了。 至于二分查找、冒泡排序、数组之类的内容我觉得是一个刚刚入门计算机科学的孩纸就应该会的,所以就很基础,没啥可说的,该会,对吧?(比如你连冒泡排序都不会,你咋学快排啥的,对吧?) 最好有一些经验积累,我在学数据结构之前就能在一定程度上运用Java的集合框架,看过比如java.util.ArrayList啊,java.util.LinkedList这样的类的源码

Python 数据结构之堆栈的实现

╄→尐↘猪︶ㄣ 提交于 2020-02-07 01:33:20
堆栈 又称为栈或堆叠,堆栈是一个抽象数据类型(ADT),在大多数编程语言中常用。 堆栈的特性是 只能从一个口子出入数据,因此也被称作 LIFO表示后进先出 后进先出。 堆栈可通过数组,结构和链表来实现。堆栈可以是固定大小或它可动态调整。 # 堆栈基于Python语言的实现 ''' 堆栈的基本方法: push(value) 入栈 向堆栈内添加新的元素 pop() 出栈 将元素移出堆栈 peek() 得到堆栈顶部元素 但不删除它 is_full() 检查堆栈是否存满 没有长度限制的堆栈可不实现该方法 if_empty() 检查堆栈是否为空 len() 返回堆栈内元素个数 travel() 遍历堆栈 ''' class Stack ( object ) : """ 堆栈类 """ def __init__ ( self ) : """ 初始化 """ self . __stack = [ ] def __len__ ( self ) : """ 返回堆栈长度 """ return len ( self . __stack ) def push ( self , value ) : """ 入栈 """ self . __stack . insert ( 0 , value ) def pop ( self ) : """ 出栈 """ return self . __stack .

python之3核心数据结构

空扰寡人 提交于 2020-02-07 00:48:26
3.1 列表list list列表是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合,在这种数据结构上进行的基本操作包括对元素的的查找,插入,和删除. 在python中,使用方括号[]表示列表 成员有序且可重复出现 列表常见的操作 操作 说明 list.append(obj) 在列表后面新增元素 del list[i] 删除元素 len(list) 求列表长度 list[i] 读取第i个元素 list[-i] 读取倒数第i个元素 list[i,j] 从第i个元素截取 list.index(objc) 从列表中找出某个值第一次出现的地方 list.index(i,obj) 在第i个元素的位置插入元素 list.pop(i) 移除第i个元素,并返回其值 3.2 集合set 在python中,使用花括号{}或set()函数创建集合 注意:当我们要创建一个空集合的时候,只能用set()进行创建,因为{ }表示的是空的字典 成员无序且不可重复出现 集合常见的操作 操作 说明 set.add(item) 往集合里添加一个元素 set.update(item) 往集合里添加元素,item是可迭代对象,如,列表、元组、字典等 set.remove(item) 将元素item从集合set中移除,如果元素不存在,则会发生错误 set.discard(item)

数据结构与算法(双向链表)

老子叫甜甜 提交于 2020-02-06 22:13:34
一种更复杂的链表叫“双向链表”或者“双面链表”,每个节点有两个链接,一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。 操作实现 class Node(object): """节点类""" def __init__(self, item): self.elem = item self.prev = None self.next = None class DoubleLinkList(object): """双链表""" def __init__(self, node=None): self._head = node def is_empty(self): return self._head is None def length(self): """链表长度""" #cur游标,用来移动遍历节点 cur = self._head #count记录数量 count = 0 while cur != None: count = count + 1 cur = cur.next return count def travel(self): """遍历整个链表""" #cur游标,用来移动遍历节点 cur = self._head #count记录数量 while cur != None: print(cur.elem,end=