数据结构与算法
文章平均质量分 93
good-destiny
这个作者很懒,什么都没留下…
展开
-
红黑树原理
1 R-B Tree简介 R-B Tree一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树的特性:(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL)是黑色。[注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果一个节点是红色的,则它的子节点必须是黑色的。...转载 2020-03-14 17:14:06 · 209 阅读 · 0 评论 -
布隆过滤器原理
1、概述 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。2、为什么要用布隆过滤器? 事实上,布隆过滤器被广泛用于网页黑名单系统、垃圾邮件过滤系统、爬虫的网址判重系统...原创 2019-12-04 11:04:06 · 328 阅读 · 0 评论 -
二叉查找树--插入、删除、查找
二叉查找树是满足以下条件的二叉树:1.左子树上的所有节点值均小于根节点值,2右子树上的所有节点值均不小于根节点值,3,左右子树也满足上述两个条件。 二叉查找树的插入过程如下:1.若当前的二叉查找树为空,则插入的元素为根节点,2.若插入的元素值小于根节点值,则将元素插入到左子树中,3.若插入的元素值不小于根节点值,则将元素插入到右子树中。 二叉查找树的删除,分三种情况进行处理:转载 2016-10-13 19:14:01 · 359 阅读 · 0 评论 -
平衡二叉树---AVL树的实现
AVL树是最先发明的自平衡二叉查找算法,是平衡二叉树的一种。在AVL中任何节点的两个儿子子树的高度最大差别为1,所以它又被成为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来平衡这棵树。假设把AVL树构造过程中需要重新平衡的节点叫做α。由于任意节点最多有两个儿子,因此高度不平衡时,α点的两颗子树的高度差2。这种不平衡可能出现在下面转载 2016-11-09 17:28:20 · 374 阅读 · 0 评论 -
KMP字符串匹配算法
#include/* P为模式串,下标从0开始 */void GetNext(char *P, int p_len, int next[]){ int i = 0; //P的下标 int j = -1; next[0] = -1; while (i < p_len) { if (j == -1 || P[i] == P[原创 2017-07-20 20:41:44 · 269 阅读 · 0 评论 -
B+/-Tree原理
B-Tree介绍B-Tree是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2.根结点的儿子数为[2, M]; 3.除根结点以外的非叶子结点的儿子数为[M/2, M]; 4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字) 5.非叶子结点的关键字个数=...转载 2019-04-14 22:13:37 · 304 阅读 · 0 评论 -
Tire树(字典树)
一、概述 1、基本概念 字典树,又称为单词查找树,Tire数,是一种树形结构,它是一种哈希树的变种。 2、基本性质根节点不包含字符,除根节点外的每一个子节点都包含一个字符 从根节点到某一节点。路径上经过的字符连接起来,就是该节点对应的字符串 每个节点的所有子节点包含的字符都不相同 3、应用场景 典型应用是用于统计,排序和公共字符串(不仅限于字符串),经...原创 2019-04-18 23:19:03 · 4782 阅读 · 0 评论 -
LeetCode刷题总结
常见的算法,主要是以下几种:基础技巧:分治、二分、贪心 排序算法:快速排序、归并排序、计数排序 搜索算法:回溯、递归、深度优先遍历,广度优先遍历,二叉搜索树等 图论:最短路径、最小生成树 动态规划:背包问题、最长子序列数据结构,主要有如下几种:数组与链表:单 / 双向链表 栈与队列 哈希表 堆:最大堆 / 最小堆 树与图:最近公共祖先、并查集 字符串:前缀树(字典树) ...原创 2019-06-26 22:22:20 · 431 阅读 · 0 评论 -
最大堆与最小堆
基本概念:1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值。堆树的定义:1、堆是一颗完全二叉树。2、堆中的某个结点的值总是大于等于(最大堆)或小于等于(最小堆)其孩子结点的值。3、堆中每个结点的子树都是堆树。构造最大堆 对于...原创 2019-08-23 11:48:57 · 380 阅读 · 0 评论 -
关键路径算法
1、拓扑排序的意义?举个例子先:一个软件专业的学生学习一系列的课程,其中一些课程必须再学完它的基础的先修课程才能开始。如:在《程序设计基础》和《离散数学》学完之前就不能开始学习《数据结构》。这些先决条件定义了课程之间的领先(优先)关系。这个关系可以用有向图更清楚地表示。图中顶点表示课程,有向边表示先决条件。若课程i是课程j的先决条件,则图中有弧。若要对这个图中的顶点所表示的课程进行拓扑排序的话原创 2016-10-12 12:17:08 · 39270 阅读 · 3 评论 -
图的拓扑排序
【1】拓扑排序在一个表示工程的有向图中,有顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。AOV网中的弧表示活动之间存在的某种制约关系。所谓拓扑排序,其实就是对一个有向图构造拓扑序列的过程。【2】拓扑排序算法对AOV网进行拓扑排序的基本思路:从AOV网中选择一个入度为0的顶点输出;然后删除此顶点,并转载 2016-10-11 21:08:37 · 571 阅读 · 0 评论 -
二叉树遍历
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;转载 2016-08-06 21:39:14 · 309 阅读 · 0 评论 -
线索二叉树
一、线索二叉树的原理 通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。 记ptr指向二叉链表中的一个结点,以下是建立转载 2016-08-07 20:08:17 · 343 阅读 · 6 评论 -
排序算法-C++
简介:总的来说,排序算法共有八大类,即冒泡排序、选择排序、快速排序、插入排序、希尔排序、归并排序、基数排序以及堆排序等,本文另外也介绍了桶排序。编程语言使用了C/C++(其实主要用的C),3个经常出现的函数形参,arr - 待排序数组名(首元素地址)、bgn - 待排序数组起始排序元素位置(有时我们仅需要对数组中某一段元素进行排序,但通常bgn = 0,即arr首元素位置)、end-待排序数组...原创 2016-08-18 17:33:35 · 319 阅读 · 0 评论 -
稀疏矩阵的创建--十字链表
一:概念 既然要用链表节点来模拟矩阵中的非零元素,肯定需要如下5个元素(row,col,val,down,right),其中:row:矩阵中的行。col:矩阵中的列。val:矩阵中的值。right:指向右侧的一个非零元素。down:指向下侧的一个非零元素。 现在我们知道单个节点该如何表示了,那么矩阵中同行的原创 2016-08-08 19:01:42 · 11483 阅读 · 0 评论 -
最小生成树之普里姆算法
为了能够讲明白这个算法,我们先构造网图的邻接矩阵,如图7-6-3的右图所示。 也就是说,现在我们已经有了一个存储结构为MGraph的MG(见《邻接矩阵创建图》)。MG有9个顶点,它的二维数组如右图所示,数组中我们使用65535代表无穷。 下面我们对着程序和每一步循环的图示来看: 算法代码:/* Prim算法生成最小生成树 */ voi原创 2016-10-09 11:02:24 · 891 阅读 · 0 评论 -
最新生成树之克鲁斯卡尔算法
基本思想:(1)构造一个只含n个顶点,边集为空的子图。若将图中各个顶点看成一棵树的根节点,则它是一个含有n棵树的森林。(2)从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图。也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之(3)依次类推,直至森林中只有一棵树,也即子图中含转载 2016-10-10 12:10:24 · 868 阅读 · 0 评论 -
最短路径之迪杰斯特拉算法
基本思想: 设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。 初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中原创 2016-10-10 21:36:23 · 1785 阅读 · 0 评论 -
最短路径之弗洛伊德算法
【1】为什么需要弗洛伊德算法?带权图中单个源点到所有顶点的最短路径问题可以用《迪杰斯特拉算法》求解。那如果要求图中每一个顶点与其它顶点之间的最短路径呢?类似可以想到的方法为:每次以一个顶点为源点,重复执行地杰斯特拉算法算法n次。这样,理论上我们便可以求得每一个顶点与其它顶点的最短路径,总的执行时间为O(n3)。好吧!为了实现这个中需求,可以采用另外一种求转载 2016-10-11 20:22:00 · 690 阅读 · 0 评论 -
单链表的整表创建
一、整表的创建(头插法) 单链表整表创建的算法思路: 1、声明一节点p和计数变量i; 2、初始化一空链表L; 3、让L的头节点的指针指向NULL,即建立一个带头节点的单链表; 4、循环: 生成一新节点赋值给P 随机生成一数字赋值给p的数据域P->data; 将p插入到头结点与前一节点之间。 实现代码算法...原创 2016-07-01 13:22:25 · 1226 阅读 · 0 评论