06 2018 档案
摘要:一、图的邻接表结构Java语言代码实现: 图的四种类型枚举类: 图的邻接表存储结构的顶点结点类: 图的邻接表存储结构的边(或弧)结点类: 图的邻接表存储结构接口类: 图的邻接表存储结构实现类: 以下面的例子为例: 输出: 二、图的邻接表结构C语言代码实现: #include "stdio.h" #i
阅读全文
摘要:一、邻接矩阵的Java语言代码实现: 以有向网为例,无向网中矩阵对称,而有向图和无向图原理类似,只是把正无穷换成0,有连接的地方为1即可: 类的四种类型枚举类 接口类 实现类: 输出: 二、邻接矩阵的创建C语言代码实现: #include "stdio.h" #include "stdlib.h"
阅读全文
摘要:由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系,也就是说,图不可能用简单的顺序存储结构来表示。 多重链表的方式,即以一个数据域和多个指针域组成的结点表示图中的一个结点,尽管可以实现图结构,但是如果各个顶点的度数相差很大,按度数最大的顶点
阅读全文
摘要:一、图的定义 线性表中的数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。 树形结构中的数据元素之间有明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。 图是一种较线性表和树更加复杂的数据结构,图形结构中结点之间的关系可
阅读全文
摘要:Huffman树是一种在编码技术方面得到广泛应用的二叉树,它也是一种最优二叉树。 一、霍夫曼树的基本概念 1.结点的路径和结点的路径长度:结点间的路径是指从一个结点到另一个结点所经历的结点和分支序列。结点的路径长度是指从根结点到该结点间的路径上的分支数目。 2.结点的权和结点的带权路径长度:结点的权
阅读全文
摘要:一、树、森林与二叉树转换的意义 二叉树由于每个结点最多只能有左孩子和右孩子,而在树中一个结点可以包括任意数目的子结点,因此二叉树的很多性质和算法被研究了出来。如果所有的树都向二叉树一样方便就好了。树与二叉树、森林与二叉树之间可以相互转换,而且这种转换是一一对应的。 二、树转换为二叉树 为了操作方便,
阅读全文
摘要:一、线索二叉树的原理 1.对于一个有n个结点的二叉链表,每个结点有指向左右孩子的两个指针域,所以一共是2n个指针域。而n个结点的二叉树一共有n-1条分支线数(除了根结点,其他每个结点都有一条分支线指向自己),也就是说,其实是存在2n - (n - 1) = n + 1个空指针域。 2.在二叉链表上,
阅读全文
摘要:一、二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域,称这样的链表叫做二叉链表。 二、结点结构包括:lchild左孩子指针域、data数据域和rchild右孩子指针域。 三、二叉链表的C语言代码实现: 四、二叉链表的Java语言代码实现: 二叉链表结点类: 二叉链表接口类: 二叉链表
阅读全文
摘要:一、顺序存储结构对数这种一对多的关系结构实现起来是比较困难的。但是二叉树是一种特殊的树,由于它的特殊性,使得用顺序存储结构也可以实现。 二、二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系,左右兄弟的关系等。
阅读全文
摘要:一、二叉树遍历算法的应用 1.二叉树的查找:在以T为根结点的二叉树中查找值为x的结点,若找到,则返回该结点;否则,返回空值。 (1)主要思想:可在二叉树的先序遍历过程中进行,并且在遍历时将访问根结点的操作视为是将根结点的值与x进行比较的操作。 复习一下二叉树的先序递归遍历的实现为: (2)主要操作步
阅读全文
摘要:一、之前给出的二叉树遍历算法都采用的是递归算法。递归算法虽然结构简洁,但在时空开销上相对较大,从而导致运行效率较低,并且有有些程序设计环境不支持递归,这就要求将递归算法转换成非递归算法。 二、将递归算法转换为非递归算法有两种方式:一种是直接转换法,不需要回溯;另一种是间接转换法,需要回溯。直接转换法
阅读全文
摘要:一、二叉树的遍历的定义 1.二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问依次且仅被访问依次。树的结点之间不存在唯一的前驱和后继关系,在访问一个结点后,下一个被访问的结点面临着不同的选择,因此,二叉树有多种遍历方
阅读全文
摘要:一、二叉树的定义 1.二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树组成。 2.二叉树的特点: 每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。 左子树和右子树是有
阅读全文
摘要:一、树的定义 1.树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、...Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree
阅读全文
摘要:一、数组的定义:数组是n(n>=1)个相同数据类型的数据元素构成的占用一块地址连续的内存单元的有限集合。所有的线性结构(包括线性表、堆栈、队列、串、数组和矩阵)的顺序存储结构实际上就是使用数组来存储。可见,数组是其他数据结构实现存续存储结构的基础,数组这种数据结构是软件设计中最基础的数据结构。 二、
阅读全文
摘要:一、模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程。若在主串中找到了一个和模式串相同的子串,则查找成功;若在主串中找不到与模式串相同的子串,则查找失败。两种主要的模式匹配算法是Brute Force算法和KMP算法。 二、Brute Force算
阅读全文
摘要:一、串的定义:串(String)是由零个或多个字符组成的有限序列,又名叫字符串。 二、串中的字符数目n称为串的长度,零个字符的串称为空串(null string),它的长度为零。子串在主串中的位置就是子串的第一个字符在主串中的序号。 三、串的大小:首先比较每个字符对应的ASCII码,然后比较长度n。
阅读全文
摘要:一、队列的链式存储结构:其实就是线性表的单链表,只不过它只能尾进头出而已,简称为链队列。 二、将队头指针front指向链队列的头结点,队尾指针rear指向终端结点。空队列时,front和rear都指向头结点。 三、在可以确定队列长度最大值的情况下,建议用循环队列,如果无法估计预估队列的长度,则用链队
阅读全文
摘要:一、队列:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。 二、队列在程序设计中的应用:键盘输入、操作系统多个程序因需要通过一个管道输出而按先后次序排队等
阅读全文
摘要:一、汉诺塔问题描述 设有三根标号为A,B,C的柱子,在A柱子上放着n个盘子,每个逗比下面的略小一点,要求把A上的盘子全部转移到C上,移动的规则是:①一次只能移动一个盘子;②移动过程中大盘子不能放在小盘子上面;③在移动过程中盘子可以放在A,B,C的任意一个柱子上。 二、用递归方法求解n个盘子的汉诺塔问
阅读全文
摘要:一、递归的定义 在高级语言中,调用自己和其他函数并没有本质的不同。把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。 递归算法求解问题的基本思想是:对于一个较为复杂的问题,把原问题分解成若干个相对简单且类似的子问题,这样较为复杂的原问题就变成了相对简单的子问题;而简单到一定
阅读全文
摘要:一、大数加法的定义 在Java中,整数类型有四种,byte(8位)、short(16位)、int(32位)、long(64位)。 其中,int类型为32为,也就是说最大的整数为2^31,如果超过了这个数,那么就不能再用整型变量来保存,更不用说保存两个这么大的数的和了。 大数就是值超过整数最大上限的数
阅读全文
摘要:一、逆波兰表达式的定义 算数表达式是由操作数、算数运算符和分隔符所组成的式子。 表达式一般有中缀表达式、后缀表达式和前缀表达式,其中,中缀表达式是将运算符放在两个操作数的中间,后缀表达式(也称逆波兰表达式)是将运算符放在两个操作数之后,而前缀表达式是将运算符放在两个操作数之前。 例如,中缀表达式A+
阅读全文
摘要:一、栈的链式存储结构,简称为链栈。思路就是把栈顶放在单链表的头部,通常对于链栈来说,是不需要头结点的。 二、链栈基本不存在栈满的情况,除非内存已经没有可以使用的空间。对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是top=NULL。 三、栈的链式存储结构的C语言代码实现: 四、栈的链式存
阅读全文
摘要:一、栈的顺序存储的一个很大的缺陷就是必须事先确定数组存储空间大小,万一不够用了,就要用编程手段来扩展数组的容量,非常麻烦。 二、对于一个栈,也只能尽量考虑周全,设计出合适大小的数组来处理;但是对于两个相同类型的栈,可以做到最大限度地利用其事先开辟的存储空间来进行操作。 三、如果有两个相同类型的栈,为
阅读全文
摘要:一、栈的定义(类似弹夹中的子弹,先进后出,后进先出) 1.栈(stack)是限定仅在表尾进行插入和删除操作的线性表。 2.把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结
阅读全文
摘要:一、静态链表 1.静态链表:用数组描述的链表叫做静态链表。C语言中,让数组的元素都是由两个数据域组成,data和cur。数组的每个下标都对应着一个data和一个cur。数据域data,用来存放数据元素,也就是要处理的数据;而cur相当于单链表中的next指针,存放该元素的后继在数据中的下标,把cur
阅读全文
摘要:一、线性表的顺序存储结构的不足:线性表的顺序结构最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间。原因就在于相邻两元素的存储位置也具有邻居关系。它们编号是1,2,3...n,它们在内存中的位置也是挨着的吗,中间没有空隙,当然就无法快速插入,而删除后,当中就会留出空隙,自然需要弥补。
阅读全文
摘要:一、线性表的定义:线性表就是零个或多个数据元素的有效序列。 二、线性表的顺序存储结构 1.定义:指的是用一段地址连续地存储单元依次存储线性表的数据元素。 2.顺序存储方式:线性表的每个数据元素的类型都相同,所以可以用一维数组来实现顺序存储结构,即把第一个数据元素存到数组下标为0的位置中,接着把线性表
阅读全文
摘要:一、算法基础 1.算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 2.算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。 (1)输入输出:算法具有零个或多个输入,但是至少有一个或多个输出。 (2)有穷性:指算法在执行有限的步骤之后,自动结束
阅读全文
摘要:一、数据结构基础 1.数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。 2.程序设计 = 数据结构 + 算法 3.数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 4.数据元素:是组成数据的、有一
阅读全文
摘要:一、flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000。 1.缓存与存储 被误操作flush后,根据当前Redis是缓存还是存储使用策略有所不同: 缓存:对于业务数据的正确性可能造成损失还小一点,因
阅读全文
摘要:一、缓存的收益和成本 左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构, 缓存加入后带来的收益如下: 加速读写:因为缓存通常都是全内存的(例如Redis、Memcache),而存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效地加速读写,优化用户体验。 降低后端
阅读全文
摘要:一、数据分布 1.数据分布理论 2.Redis数据分区 Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据 Redis虚拟槽分区的特点: 解耦数据和节点之间的
阅读全文
摘要:Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的。 Redis从2.8开始正式提供了Redis Sentinel(哨兵)架构来解决这个问题。 一、基本概念 1.主从复制的问题 (
阅读全文
摘要:Redis所有的数据都存在内存中,当前内存虽然越来越便宜,但跟廉价的硬盘相比成本还是比较昂贵,因此如何高效利用Redis内存变得非常重要。 高效利用Redis内存首先需要理解Redis内存消耗在哪里,如何管理内存,最后才能考虑如何优化内存。 一、内存消耗 有些内存消耗是必不可少的,而有些可以通过参数
阅读全文
摘要:为什么说阻塞是Redis的噩梦: Redis是典型的单线程架构,所有的读写操作都是在一条主线程中完成的。当Redis用于高并发场景时,这条线程就变成了它的生命线。如果出现阻塞,哪怕是很短时间,对于应用来说都是噩梦。 导致阻塞问题的原因: 内在原因:不合理地使用API或数据结构、CPU饱和、持久化阻塞
阅读全文
摘要:在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础,哨兵和集群都是在复制的基础上实现高可用的。复制也是Redis日常运维的常见维护点。
阅读全文
摘要:一、RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 1.触发机制 (1)手动触发:save命令和bgsave命令 save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。 b
阅读全文
摘要:一、理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具。一开始看到序列化这些字眼的时候,感觉到一头雾水。于是,参考了网上的很多资料,理解了Java序列化与反序列化(参考https://blog.csdn.net/wa
阅读全文
摘要:在学习Redis的过程中,在学到Redis客户端Jedis的时候,考虑到能不能在ubuntu下用Vim编写Java程序并且能够运行呢? 于是,首先在网上调研了一番用Vim写Java程序的可实现性。 相对于我们熟悉的IDE来说,使用Vim编写程序并且在Ubuntu下通过命令行运行还是比较麻烦的: 首先
阅读全文

浙公网安备 33010602011771号