算法

Floyd算法(弗洛伊德算法)

我们两清 提交于 2020-01-19 15:24:30
算法描述:   Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。 核心思路:通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 算法过程:   把图用邻接距阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个距阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。 在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3

SPFA算法——最短路径

感情迁移 提交于 2020-01-19 15:18:04
粗略讲讲SPFA算法的原理,SPFA算法是1994年西安交通大学段凡丁提出 是一种求单源最短路的算法 算法中需要用到的主要变量 int n; //表示n个点,从1到n标号 int s,t; //s为源点,t为终点 int d[N]; //d[i]表示源点s到点i的最短路 int p[N]; //记录路径(或者说记录前驱) queue <int> q; //一个队列,用STL实现,当然可有手打队列,无所谓 bool vis[N]; //vis[i]=1表示点i在队列中 vis[i]=0表示不在队列中 几乎所有的最短路算法其步骤都可以分为两步 1.初始化 2.松弛操作 初始化: d数组全部赋值为INF(无穷大);p数组全部赋值为s(即源点),或者赋值为-1,表示还没有知道前驱 然后d[s]=0; 表示源点不用求最短路径,或者说最短路就是0。 将源点入队;     (另外记住在整个算法中有顶点入队了要记得标记vis数组,有顶点出队了记得消除那个标记) 队列+松弛操作 读取队头顶点u,并将队头顶点u出队(记得消除标记);将与点u相连的所有点v进行松弛操作,如果能更新估计值(即令d[v]变小),那么就更新,另外,如果点v没有在队列中,那么要将点v入队(记得标记),如果已经在队列中了,那么就不用入队 以此循环,直到队空为止就完成了单源最短路的求解 SPFA可以处理负权边 定理:

算法之【红黑二叉树】

社会主义新天地 提交于 2020-01-19 14:39:20
【前言】 自己整理的东西才是自己的。 【概念】 红黑树(Red Black Tree)别名:对称二叉B树, 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。 【对比其他树】 红黑树的统计性能要好于AVL树(也叫平衡二叉树,根据作者命名Adelson-Velskii和Landis,将其称为AVL-树),因此,红黑树在很多地方都有应用。 其他平衡树还有:AVL,SBT,伸展树,TREAP 等等。 来源: 51CTO 作者: Red_Ant_hoyl 链接: https://blog.51cto.com/13479739/2467811

数据结构与算法(线性表、栈、队列)

给你一囗甜甜゛ 提交于 2020-01-19 12:17:52
数据结构与算法(线性表、栈、队列)     * 最近在学习数据结构与算法,期间也由于理解的不透彻死活不能用程序去实现它。所以我将我的学习过程以及期间出现的问题整理出来,这也是我的再学习过程,也希望能对大家有一点帮助。栈和队列都是使用顺序表实现的,因为相对来说比较简单;在后续的树和图中,使用链表相对简单,所以在树和图中我在放出链表的代码。 逻辑关系      · 在数据结构中,根据逻辑关系可大致分为线性结构(线性表、栈、队列、字符串、数组、广义表)以及非线性结构(树、图)。其中,最为简单且基础的是线性结构,在之后的学习过程中,任何类型的数据结构都或多或少要以它们为基础去创建,去构造。所以在学习的开始,我先基于我的一些不成熟的理解去使用python完成对线性表、栈、队列的构造。 线性表:     1.描述: 线性表是由n (n>=0)个类型相同的数据元素(结点)a1,a2,….,ai,    ….,an组成的有限序列。其中,数据元素的个数n定义为表长。当n=0时称为空表,非空的线性表(n>0)    记为:(a1,a2,….,ai,……,an)     2.逻辑特征:仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。     3.线性表的特点:         同一性:线性表由同类数据元素组成,每一个ai必须属于同一数据对象。         有穷性

主存空间的分配和回收实验报告

╄→尐↘猪︶ㄣ 提交于 2020-01-19 11:32:08
实验四 主存空间的分配和回收 网络工程专业 姓名:蔡利聪 学号:201306114117 一、目的和要求 1. 实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。 2 .实验要求 采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。 (1)设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。 (2)或在程序运行过程,由用户指定申请与释放。 (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。 二、实验内容 编写并调试一个模拟的内存分配与回收程序,使用首次适应算法、循环首次适应算法对内存空间的分配与回收。 三、实验方法、步骤及结果测试 1. 源程序名: a.cpp 可执行程序名: a.exe 2. 原理分析 (1)编写该程序首先要给定一个一定空间大小的内存,即申请空闲区空间最大值,并且要定义空间的各分区的作业标号、分区起始地址、分区长度,单位为字节、分区表的状态位、前向指针、后向指针、已分配分区表、空闲分区等。 (2)通过定义空间分区后,还要定义空间分区链表并对其进行初始化,对空闲分区和已分配分区进行链表访问,对于空闲分区可以分配给新进来的进程使用

【算法】MD5加密

做~自己de王妃 提交于 2020-01-19 06:03:47
1.什么是MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。——百度百科 MD5其实不算是加密算法,而是一种信息的摘要。它的特性是不可逆的,所以除了暴力破解 一般逆序算法是得不到结果的。例如:使用如下算法进行加密,对一个字符串利用它的长度和每一位的ASCII相加得出值,比如“bc”那么就是2+98+99=199,如果利用这个算法进行逆推的得出的答案就不唯一,比如"ac",“Ho”,"AAB"等等。 2.MD5加盐 如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。 加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。 3.MD5的加密步骤 接下来大致罗列一下MD5加密的计算步骤,可以参考这个视频, MD5算法视频 1、数据填充

PBFT && RBFT算法流程

牧云@^-^@ 提交于 2020-01-19 02:32:07
PBFT && RBFT算法流程以及其实现(上) 这篇文章主要是讲一下RBFT中共识算法流程以及节点的加入的流程。在下一篇博客中,将使用Java实现该算法。 传统的PBFT算法无法动态的添加和删除结点,高鲁棒拜占庭容错算法RBFT(Robust Byzantine Tolerance)算法实现了该功能。 在RBFT算法中,有几个变量我们需要知道:f,N,quorum N ; 代表结点的数量。 f :代表PBFT中最多能容忍的错误的结点$ f = \lfloor\frac{N-1} { 3} \rfloor$ quorum:达到共识需要的结点数量 $quorum = \lceil \frac {N + f +1 }{2 }\rceil $ 因此在PBFT算法中,为了能够容忍f个错误,需要的结点数量是$3f+1$ 在RBFT算法中,有一个主节点和多个从结点,其中主节点是通过选举产生的,负责对客户端发来的交易进行打包处理,而从节点很简单,进行共识认证以及主结点的选取。 RBFT && PBFT的常规流程 下面是来自 hyperchain 的关于RBFT流程的一些介绍: RBFT常规流程 RBFT的常规流程保证了区块链各共识节点以相同的顺序处理来自客户端的交易。RBFT同PBFT的容错能力相同,需要至少3f+1个节点才能容忍f个拜占庭错误。下图为最少集群节点数下的共识流程,其N=4,f=1

数据结构与算法对嵌入式的影响与使用:Studying Route

倾然丶 夕夏残阳落幕 提交于 2020-01-19 02:19:04
未来软件的发展趋势来讲,数据结构与算法会越来越普适: 程序 = 数据结构 + 算法 一方面是因为硬件的不断升级,使得很多嵌入式系统现在已经与桌面系统的区别越来越小,可以跑更多的软件平台,使得数据结构与算法可以有更宽阔的应用场景。 另一方面,即使是嵌入式设备,其软件功能需求也在不断的升级,很多嵌入式平台应用了越来越多的视觉算法、数据库等等,有些需求的背后也是需要数据结构与算法做支撑的。 对于计算机类的特定算法(复杂度较高、运行资源需要多),比如搜索类的、地图求最短、最优路径之类的,在一般的嵌入式里面不太可能用得到,这些可以作为拓展思考用;但是图、红黑树、二叉树、字符匹配、查找、堆等等都是真真正正能够用得到的东西,需要慢慢渗透掌握。 学习路径: 1. 大O(复杂度分析)和迭代器 (最基本的理论) 2. 动态数组vector (理论推导和设计原理) 3. 双链表list (跟STL的双链表list相似) 4. 栈和队列(stack、queue) 5. 优先队列 (堆排序的思想+动态数组vector) 6. 常用算法 (检索,排序,仿函数等设计原理) 7. 轻量级关联容器(用动态排序数组代替红黑树做轻量级关联容器。适合很少的插入和删除、大量的检索,内存紧张的场合。) 8. 内存管理器基础 (边界标记、位图、自由列表、引用计数) 9. 哈希表 (不同数据类型的哈希算法、三个哈希表的原理)

美妙的字符串之KMP算法

ぐ巨炮叔叔 提交于 2020-01-19 01:55:20
概述 讲解非常非常详细的KMP算法 在S串中查找P串的位置所在 暴力算法:S:i, P:j 若s[i] == p[j],i++,j++; 若s[i]!=p[j], i = i-(j-1)+1, j = 0; 之前的已匹配段回溯肯定导致失配,因为p[0]!=p[last(当前不匹配的j位置)-1]; KMP算法:i不回退,只需要移动j。 1. 对模式串进行处理:next[j]是不匹配时的j下一步回溯位置,取决于当前字符的字符串中有最大长度的相同前缀后缀。 2. 对模式串P的处理:i从0-plen-1,遍历得到next[], 当某个字符失配时,该字符对应的next值会告诉你下一步匹配中,模式串应该跳到那个位置,如果next[j] = 0或者-1,则跳到模式串的开头字符,若next[j] = k 且k>0,代表下次匹配跳到j之前的某个字符,而不是跳到开头,且具体调过来k个字符。 int next[1000000+100]; void kmp_pre(char x[], int n){ int i, j; i= 0; j = next[0] = -1; while(i < n){ while(j!=-1 && x[i]!=x[j]) j = next[j]; next[++i] = ++j; } } int KmpSearch(char *s, char *p){ int i =0;