算法
丶丶路遥
这个作者很懒,什么都没留下…
展开
-
红黑树
1 描述在之前描述的AVL树中,对于删除某个元素导致树不平衡的情况,需要进行旋转调整,使之恢复平衡。然而,该过程可能需要沿着parent关系经历O(logn)次旋转操作才可使得整棵树平衡。因此,在此基础上设计出来另外一种数据结构–红黑树,它的添加和删除的旋转操作都是O(1)级别,但需要牺牲一些平衡性。文章省略了对于B树,AVL树的一些性质和操作的描述,可参考AVL树、B树。1.1性质红黑树需满足以下几条性质:结点是RED或者BLACK根结点是BLACK叶子结点外(这里指外部的空节点)都是B原创 2020-06-07 16:35:43 · 226 阅读 · 0 评论 -
B树
1 描述B树中的一个结点存放多个元素,并允许存在多个子结点,元素与子结点的对应关系为N+1关系,如下图所示。上图秒速了一棵4阶B树(度最多为4),当前元素大于左子树中的任意元素,小于右子树中的任意元素。1.1 性质假设我们要构造一棵m阶B树,其存在如下性质:根节点元素个数:1≤x≤m-1非根节点元素个数:⌈m/2⌉-1≤x≤m-1根节点子节点个数:2≤y≤m非根节点子节点个数:⌈m/2⌉≤y≤m2 操作流程对于任意一棵B树,需要符合1.1中的性质。在插入和删除元素的过程中有可能破坏原创 2020-06-05 20:02:11 · 211 阅读 · 0 评论 -
AVL树
描述AVL树是在儿叉搜索树的基础上衍生出来的数据结构。在儿叉搜索树中,高度取决于结点数据的大小的排序和插入顺序,在某些情况下,儿叉排序树的高度非常高,甚至退化成链表,使得其查找效率低下。因此,AVL树引入“平衡因子”的概念,平衡因子=左子树高度-右子树的高度。AVL树规定平衡因子的绝对值不大于1来保证二叉树的平衡。操作流程添加结点情况添加一个结点对其父节点影响不会导致其失衡,而可能导致祖父结点失衡(可能所有祖父结点),因此只需让高度最低的失衡结点恢复平衡即可使得整棵树平衡,旋转操作次数为O(1)。原创 2020-06-03 06:39:12 · 175 阅读 · 0 评论 -
二叉排序树
描述在二叉树的基础上衍生出的数据结构,对任意结点左右孩子节点之间都有顺序,如:左孩子<当前节点<右孩子节点。因此,提高了有序数据的搜索速率,类似于二分搜索法。关于二叉树的在之前的章节中有描述。具体参考:二叉树的描述与实现接口设计public interface BSTree<E> { //添加元素 void add(E element); //删除元素 void remove(E element); //是否包含当前元素 boolean contains(E e原创 2020-06-03 03:26:42 · 155 阅读 · 0 评论 -
二叉树
二叉树一个节点有两个后继,称为左右孩子,左右孩子有序不能相互跌倒。二叉树又衍生出多种不同的形态,如红黑树、二叉排序树、B-树、AVL树等。原创 2020-06-03 01:42:23 · 188 阅读 · 0 评论 -
二叉树的递归与非递归方式的先序、中序、后序、层序遍历算法(Java版本)
介绍本文提供了二叉树的构造、递归与非递归方式的遍历算法,其中递归方式较为简单。但在实际应用中,递归的遍历方式适用于递归深度不高的算法中,其一般使用非递归方式来解决。二叉树建树实验一:输入测试数据序列:A B # D # # C # #构造二叉树示意图:非递归遍历二叉树的原理递归方式遍历二叉树较为简单,本文不做过多描述。非递归方式需要用到栈作为辅助数据结构来实现,非递归遍历二叉...原创 2020-01-07 17:20:55 · 1914 阅读 · 0 评论 -
图的深度、广度优先、最小生成树、最短路径算法(Java版本)
介绍本文提供了图的邻接表、邻接矩阵的Java实现,包括深度优先算法、广度优先算法、prim算法和地杰斯特拉算法。原理分析输入图:深度优先遍历:广度优先遍历:注意:邻接矩阵和邻接表同样的输入遍历的结果可能会不完全一样,原因邻接表的构造并非将小编号的结点连接在靠前的位置,因此导致遍历结果和邻接矩阵不相同,但其在逻辑上仍然满足图的深度优先遍历。另外,最小生成树和最短路径当图中存在两...原创 2020-01-06 19:46:45 · 1207 阅读 · 1 评论 -
迷宫问题
介绍迷宫问题一般深度优先遍历或者广度优先遍历解决,辅助数据结构使用栈或者队列。使用栈解决该问题时,将栈顶能达到的一个位置入栈,若发现该路不通,则退栈,通过栈顶元素继续访问其他可达到的位置,直到走完整个迷宫。若使用非循环队列,将队头能到达的所有位置入队,并记录该位置的前驱为队头元素,最后通过队列的元素的前驱记录可得到整个迷宫的路线。问题描述...原创 2020-01-05 11:35:21 · 3772 阅读 · 2 评论 -
Bit Vector算法
摘要:该算法常用到包分类中,初次接触到bit vector算法是在对海量数据的处理。设想我们有个很大的数据集,它的总体个数为400亿个数字,需要消除重复的数据,一种想当然的做法是,每次读取一部分,进行消重,如每次读取1000万个数据进行消重,这样我们就可以将40亿个数字分成400部分,将消重后的数据合并,然后进行进一步消重,这种做法显然需要的花费很大的时间开销。假设将所有数据都读取到内存中,发...原创 2018-09-22 13:44:38 · 6287 阅读 · 0 评论 -
动态规划
简介动态规划主要用来解决重叠子问题的空间浪费问题和求解最优化问题。动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不像搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以...原创 2018-12-08 20:20:14 · 148 阅读 · 0 评论 -
布谷鸟缓存
介绍缓存技术是用来解决高并发,大数据下的热点访问的性能问题。一般使用的方式有直接使用Hash缓存,但哈希冲突率与缓存表所占内存大小成反相关。设计一个内存使用少而缓存利用率较高的缓存成为了一个迫切需要关心的问题。布谷鸟缓存模仿布谷鸟的习性而设计,其查找流程只最多只需经过两次哈希查找,而其插入流程较慢,需要在多个“桶”中寻找空间。...原创 2019-03-04 20:23:30 · 390 阅读 · 0 评论 -
桶排序
介绍桶排序常被应用在数据规模一定,允许少量空间开销的情况下,假设待排序数组长度为m,待排序数据范围长度为n,则其时间复杂度为O(m+n),空间复杂度为O(m+n)算法思想桶排序通过统计每个元素前面元素的个数来进行排序。如一个元素e前面有6个元素,那么自身肯定排在第7位。通过一个例子来说明:假设有待排序数据:1,1,7,3,3,8,3,2,1,4,6,8,7如下图所示:1、用bitma...原创 2019-04-15 20:36:47 · 133 阅读 · 0 评论 -
BloomFilter
介绍布鲁姆过滤器常用作对元素和集合的从属关系进行判定,用来绕过在集合中查找对应元素的过程。本文将介绍一种最简单的基于比特向量的布鲁姆过滤器,并提供Java代码。实现方法插入:1、初始化空集2、插入集合元素a,经过4个不同哈希函数映射到4个位置,将其置13、插入元素b操作同上4、插入元素c操作同上查询:1、查询元素c2、经过4个不同的哈希函数映射到4个不同的位置3、若发现有1...原创 2019-08-08 18:46:10 · 362 阅读 · 1 评论 -
Counting Bloom Filter
介绍Bloom过滤器常被用作判断集合元素的从属关系,用来绕过对集合的遍历,加速集合的查找。然而,标准的Bloom过滤器使用一个比特向量来记录元素的从属情况,使得其无法直接支持元素的删除。本文将介绍一种Counting Bloom Filter,使用多个bit位来代替标准bloom过滤器中的一个bit位,从而可对每个槽位上映射的次数计数,使其可支持删除。实现方法插入:1、初始化空集(所有位置...原创 2019-08-14 11:20:55 · 488 阅读 · 0 评论 -
高性能的多对少集合映射调整方法
介绍当一大一小两个集合存在关联关系时,每次小的集合中元素的位置调整,需遍历大集合来调整其对应的关联关系,开销较大,本文介绍一种方法,使得无需调整大集合也能保持其对应的关联关系。原理通过引入中间集合来记录大集合到小集合的映射关系,大集合中的元素始终指向中间集合中的元素,当小集合中的元素位置发生调整时,无需遍历修改大集合,而只需修改中间集合即可保持大集合与小集合的映射关系。测试实现#incl...原创 2019-09-20 16:17:55 · 275 阅读 · 0 评论 -
词典快速匹配方案
介绍对于构造了几百万上千万的集合中,快速查找对应的元素是一种常见的应用场景,因此本文将探讨一种如何在一个大集合中快速查找对应元素的方法。查找方案哈希查找和字典树是两种高性能的查找方法。其中字典树使用最长前缀匹配法,其查找速度非常快,但由于更新时需要调整整个树,导致其更新速度较慢,因此字典树不适用于动态集合。而哈希查找解决了更新速度慢的问题,因此本文主要介绍基于哈希查找的词典匹配方法。本文将...原创 2019-10-04 21:16:35 · 1605 阅读 · 0 评论 -
基数排序
介绍基数排序是一种相当快的排序算法,它用少量空间换取时间,其思想类似于桶排序,基数排序从个位开始,到十位、百位、千位、等,每次确定某一位的顺序,直到整个序列有序。示例在这里插入图片描述代码实现(Java和C)Java实现package test;import java.util.Arrays;import java.util.LinkedList;import java.uti...原创 2019-10-05 20:36:11 · 127 阅读 · 0 评论 -
KMP算法
朴素匹配算法 我们常会用到ctril+F这个功能,在文本中查找某个关键字,并返回第一次出现的位置。 朴素匹配算法是一种暴力破解法,逐个进行比较。 为了简单起见,这里的串下标是从1开始的。 都某个字符匹配失败的时候,i和j同时回溯。//串的简单匹配算法int indexof(Str str,Str s){ int i = 1,j = 1,k = ...原创 2018-09-05 16:20:18 · 414 阅读 · 0 评论 -
quotient filter解读
我们称quotient filter为商过滤器,与布鲁姆过滤器不同的是,商过滤器采用一个哈希函数,具有更高的查找效率,它将关键字key经过一次哈希运算后,得到q_hash,然后将q_hash/2^r作为商,r=q_hash%2^r作为余数。我们构造一个记录器,它由3*2*r个bit组成,每3个bit对应给槽,那么总共就有2^r个槽,每个槽中存放r余数。当插入一个元素的时候,先计算出商和余数,...原创 2018-07-10 16:08:57 · 1662 阅读 · 0 评论 -
递归算法
递归算法的几个案例递归算法遍历斐波那契数列,递归算法遍历树,排序等等:斐波那契数列的迭代遍历和递归遍历迭代的方式遍历 /** * get the number n position of FEIB by iteration * @param n * @return the number n position of FEIB */ public s原创 2017-10-26 15:03:51 · 202 阅读 · 0 评论 -
二叉树的几个基本算法
二叉树的基本算法1.二叉树的基本遍历算法(先序、中序、后序、层序)2.二叉树的优化遍历算法(用栈实现)3.求二叉树的深度算法4.求二叉树的宽度算法5.二叉树的构建算法#include <stdio.h>#include <stdlib.h>/** * 二叉树的基本算法* 1.二叉树的基本遍历算法(先序、中序、后序、层序)* 2.二叉树的优化遍历算法(用栈实现)* 3.求二叉原创 2017-11-20 10:37:49 · 1097 阅读 · 0 评论 -
3---------最短路径--迪杰斯特拉算法
迪杰斯特拉算法常用来求某个顶点到所有顶点的最短路径 当然能够获取到到所有顶点的最短路径,那么也能够获取到它到某一顶点的最短路径了 例如上面这个图,从1顶点出发,用迪杰斯特拉算法求到每个顶点的最短路径如何求呢?,下面,模拟迪杰斯特拉算法实现求最短路径 构造三个数组 int disk[]; [0,1,3,n,n,n,n] //先初始化1到每个顶点的最小值,n表示无穷原创 2017-12-09 23:47:37 · 340 阅读 · 0 评论 -
4---------最小生成树--prim算法
用prim算法构造最小生成树的思路比较简单,实际上也是贪心算法的一种,依次遍历每个结点,寻找与当前生成树最小的结点,值得注意的是,不是到当前结点的最短路径,而是寻找与当前生成树最小的结点/*** prim算法* 思路:从某个结点开始,依次构造最小生成树,每次构造,都需要修正当前生成树到每条边的距离*/void prim(MGraph G,int v0){ int sum;原创 2017-12-10 17:15:46 · 570 阅读 · 0 评论 -
7---------迪杰斯特拉算法的简单应用
使用迪杰斯特拉算法解决任意两点间的最短路径问题package list;import java.util.Scanner;/** * 稍微修改迪杰斯特拉算法即可得出结论 * 思路:从该结点出发,依次向外探测,并与修正与当前生成路径的最短路径 * @author 哑元 * */public class Test1 { public static void main(String[原创 2017-12-19 20:32:41 · 926 阅读 · 0 评论 -
1----------图(邻接矩阵)的相关算法
图的相关算法走进算法世界的大门,发现算法中的奥秘,让我们一起来探险吧。图的邻接矩阵结构体定义 图的邻接矩阵结构体定义typedef struct{ int no; char data;//存放顶点信息}Node;typedef struct{ int edges[maxSize][maxSize]; //边表 Node nodes[maxSize];原创 2017-12-02 17:43:54 · 620 阅读 · 0 评论 -
2----------图(邻接表)的相关算法
走进算法世界的大门,发现算法中的奥秘,让我们一起来探险吧。图(邻接表)的结构体定义typedef struct ArcNode{ //边表 int adjvex; //边所指向的结点 int data; //边存放的权值 struct ArcNode * next;}ArcNode;typedef struct VNode{ ArcNode * firstar原创 2017-12-03 06:50:39 · 261 阅读 · 0 评论 -
8---------单链表算法的简单应用和巩固
单链表算法主要注意处理好指针的指针的指向问题 链表的逆置 两个链表的交集合问题(链表初始无序) 两个链表的并集问题(链表初始无序) 链表A-链表B差集问题(链表初始无序) 找到单链表倒数第k个结点并打印#include <stdio.h>#include <stdlib.h>/**带头结点的单链表* 链表的逆置* 两个链表的交集合问题(链表初始无序)* 两个原创 2017-12-20 14:19:21 · 253 阅读 · 0 评论 -
9---------栈和队列的应用
第一部分:顺序栈的结构体定义,初始化,push,pop,判断空,判断满 第二部分:链栈的结构体定义,初始化,push,pop,判断空,没有栈满的情况就不用判断了 第三部分:顺序队列(循环队列)的结构体定义,初始化,push,pop,判断空,判断满 第四不对:链队的结构体定义,初始化,push,pop,判断空,没有队满的情况就不用判断了 括号匹配算法 十进制转16进制以下的个各进制原创 2017-12-20 18:35:11 · 177 阅读 · 0 评论 -
10---------二叉树的算法的简单应用
二叉排序树的构建和查找算法 求二叉树的宽度算法 求二叉树的深度算法 二叉树的构建算法 * #include <stdio.h>#include <stdlib.h>/*** 二叉排序树的构建和查找算法* 求二叉树的宽度算法* 求二叉树的深度算法* 二叉树的构建算法* */typedef struct BTNode{ int data; struc原创 2017-12-20 21:24:07 · 417 阅读 · 0 评论 -
11---------几种简单排序算法
链表的排序(简单插入排序) 冒泡排序 双端冒泡排序 插入排序 简单选择排序 快速排序 堆排序 #include<stdio.h>/** 链表的排序(简单插入排序)* 冒泡排序* 双端冒泡排序* 插入排序* 简单选择排序* 快速排序* 堆排序*/typedef struct Node{ struct Node * next; int data原创 2017-12-20 23:16:00 · 321 阅读 · 0 评论 -
5---------并查集问题
并查集合问题,实际上是孩子双亲结构,用来可以直接找到根结点 常用来判断根节点是否一样,也就是成不成环的问题 public static int find(int vex[],int v){ while(vex[v] != v) v = vex[v]; return v; }//核心代码 引用如下例子来说明并查集问题 这个题思路比较简单,实际原创 2017-12-13 00:53:29 · 191 阅读 · 0 评论 -
6---------prim算法的简单应用
用prim算法实现求通信花费问题,我们经常需要的只需要将求和的部分换成其他操作就行了 代码展示package list;import java.util.Scanner;/** * * @author 哑元 * */public class Test1 { public static void main(String[] args) { Scanner sca原创 2017-12-19 00:41:31 · 947 阅读 · 0 评论 -
C++语言算法之求任意两个相同字符的最大距离
提问 我们有一个这样的字符串abcaffdffqwwwwrcs,最大长度的多少呢?我们发现两个c直接的距离最大,这里最大长度应该是第2个c的位置-第一个c的位置。算法思路 下面来讲一下算法是实现思路: 先来看看,我们如何求第一个字母a之间的距离,我们先确定a的位置是第一个,我们用一个变量保存a的位置,然后再通过下标移动到底2个a的位置,只需要将第二个位置减去第一个位置即可,这就得到了原创 2018-03-22 15:04:52 · 982 阅读 · 0 评论 -
判断单链表是否成环
对于如下的一个单列表,我们如何判断它是否成环。 我们让两个指针分别是fast和slow指针指向头结点,让fast指针一次移动两个结点,slow指针一次只移动一个结点。 由于fast走的比较快,slow走的比较慢,这就导致在环中一定有一个相遇的结点,那么slow所走的路径长度为len+ x,fast所走路径为为nR + len + x , n是为fast的圈数,大于等于1;R为环的长度。 由原创 2018-04-10 17:07:47 · 1746 阅读 · 0 评论 -
拓扑排序
基本思路是:从AOV网中选择一个入度为0的顶点并输出,然后删除此顶点,并删除以此顶点为尾的狐,直到图中不存在入度为0的点, 这里用代码实现的方法是:先让入度为0的点都入栈,当栈不为0的时候,出栈,出栈的时候打印出栈的顶点,并将该顶点所指向的顶点的入度减一。#include <iostream>using namespace std;#define ma...原创 2018-05-05 20:30:15 · 113 阅读 · 0 评论 -
八皇后问题
回溯法解决八皇后问题 八皇后问题,国际象棋是8x8的棋盘,其中皇后可以斜着走,竖着走,横着走,无距离限制 问:如果在这个棋盘上面摆满8个皇后,同时相互不被吃掉 public class QueenSort { static int count = 1; public static void main(String[] args) { int arr原创 2017-10-27 21:57:05 · 476 阅读 · 0 评论