为您找到搜索结果:2024个
数据结构—完全二叉树
上篇博客介绍了一种非线性结构—普通树的含义以及一些特性,本文将介绍二叉树、满二叉树以及完全二叉树的一些特性及实现。首先,什么是二叉树?二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序。 二叉树的重要特性:1.二叉树的第i层上节点数最多2n-1。2.高度为k的二叉树中,最多有2k-1个节点。3.在任意一棵二叉树中,如果终端节点的度为n,度为2的节点数为m,则n=m+1。4.二叉树的子树有左右之分,顺序不能颠倒。5.若采用连续储存的方式存放二叉树,则节点下标之间的关系: 若某个节点的下标为i,则这个节点的父节点的下标为i/2。 若某个节点下标为i,且节点的度为2,则这个节点的左子节点的下标为2*i+1,右子节点的下标为2*i+2。 满二叉树:树最后一层没有任何子节点,其余每一层的所有节点都有2个子节点。满二叉树的性质:1.满二叉树的第i层的节点数为2n-1个。2.深度为k的满二叉树必有2k-1个节点,叶子数为2k-1。3.满二叉树中不存在度为1的节点,每一个分支点中都两棵深度相同的子树,且叶子节点都在最...
更快找到正确的机器学习算法
(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)题记:机器学习无疑是现在一个高大上的热点,而且微软在Azure提供了机器学习的服务。那么如何更快找到正确的机器学习算法呢?微软也给大家提供了建议。随着大数据的深入应用,机器学习也从学术界逐步走入到工业界,现在电子商务、社交、广告、智能硬件都有机器学习的身影。微软作为一家有着深厚科研实力的公司,不仅在Azure中提供了机器学习的服务供大家选用,还提供了一个名为AzureMachineLearningStudio的在线工具让大家更方便的学习和使用机器学习。这个工具提供了大量的算法让你用于自己的分析解决方案当中,这些算法大致分为如下几类:回归、归类、聚集、异常检测。每种算法都是为了解决机器学习中遇到的特定问题而设计的。那么问题来了,如何为自己的问题选择正确的算法呢?微软在《MicrosoftAzureMachineLearningAlgorithmCheatSheet》给我们提供了一个很好的指南。这是一个选择流程图,大致流程文字描述如下:是否要预测未来的数据点如果否,那么选择聚集算法(只有k近邻算法可选)如...
sha256算法原理
SHA256是SHA-2下细分出的一种算法SHA-2下又可再分为六个不同的算法标准包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度、循环运行的次数等一些微小差异外,算法的基本结构是一致的。回到SHA256上,说白了,它就是一个哈希函数。哈希函数,又称散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。sha256在线验证工具地址2.1常量初始化SHA256算法中用到了8个哈希初值以及64个哈希常量其中,SHA256算法的8个哈希初值如下:h0:=0x6a09e667h1:=0xbb67ae85h2:=0x3c6ef372h3:=0xa54ff53ah4:=0x510e527fh5:=0x9b0...
(原创)详解KMP算法
KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白。这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法。 什么是KMP算法:KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。 首先,对于这个问题有一个很单纯的想法:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位。这有什么难的?我们可以这样初始化: 之后我们只需要比较i指针指向的字符和j指针指...
JavaScript中的不同逻辑算法结合操作解决实际多重问题以及常用函数类型
数组去重+快速排序//老数组vararr1=[1,2,2,3,8,6,6,4,5,5];//定义新数组vararr2=[];内部可运用布尔类型进行判断数组的唯一性for(i=0;i<arr1.length;i++){varstatus=0;for(j=0;j<arr2.length;j++){if(arr1[i]==arr2[j]){status=1;break;}}if(status==0){arr2.push(arr1[i]);}}for(i=1;i<arr2.length;i++){for(j=0;j<arr2.length;j++){if(arr2[j]>arr2[j+1]{temp=arr2[i];arr2[j]=arr2[j+1];arr2[j+1]=temp;}}}for(variinarr2){document.write(arr2[i]);}逻辑是现将原数组与定义的新数组进行循环对比去除重复元素,再将原数组剩余元素推入新数组;最后对新数组里面的元素进行有序排列;此两种算法结合操作实现数组的去重+自行排序的双重解决方案日期时间函数varz=...
深度学习(一)——CNN算法流程
参考:http://dataunion.org/11692.html 20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(ConvolutionalNeuralNetworks-简称CNN)。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。K.Fukushima在1980年提出的新识别机是卷积神经网络的第一个实现网络。随后,更多的科研工作者对该网络进行了改进。其中,具有代表性的研究成果是Alexander和Taylor提出的“改进认知机”,该方法综合了各种改进方法的优点并避免了耗时的误差反向传播。 一般地,CNN的基本结构包括两层: 1)特征提取层:每个神经元的输入与前一层的局部接受域相连,并提取该局部...
Adam 算法
Adam算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率(即alpha)更新所有的权重,学习率在训练过程中并不会改变。而Adam通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率Adam算法的提出者描述其为两种随机梯度下降扩展式的优点集合,即:适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。Adam算法同时获得了AdaGrad和RMSProp算法的优点。Adam不仅如RMSProp算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncenteredvariance)。具体来说,算法计算了梯度的指数移动均值(exponentialmovingaverage),超参数beta1和beta2控制了这些移动均值的衰减率。移动均值的初始值和beta1、beta2值接近于1(推荐值),因此矩估计的偏差接近于0。该偏差通过首...
第十四章 数字签名算法--RSA
注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第9章“带密钥的消息摘要算法--数字签名算法”《大型分布式网站架构(设计与实践)》第3章“互联网安全架构”14.1、数字签名算法特点:非对称加密算法+消息摘要算法的结合体抗否认性、认证数据来源、防止数据被篡改(具体意思与做法查看下边的过程与类比部分)私钥加密(签名)、公钥解密(验证)过程:1)消息发送者产生一个密钥对(私钥+公钥),然后将公钥发送给消息接收者2)消息发送者使用消息摘要算法对原文进行加密(加密后的密文称作摘要)3)消息发送者将上述的摘要使用私钥加密得到密文--这个过程就被称作签名处理,得到的密文就被称作签名(注意,这个签名是名词)4)消息发送者将原文与密文发给消息接收者5)消息接收者使用公钥对密文(即签名)进行解密,得到摘要值content16)消息接收者使用与消息发送者相同的消息摘要算法对原文进行加密,得到摘要值content27)比较content1是不是与content2相等,若相等,则说明消息没有被篡改(消息完整性),也说明消息却是来源于上述的消息发送方(...
[区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结。尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理。本篇文章主要参考《区块链技术指南》,首先表示感谢! ---Begin--- 区块链架构是一种分布式的架构。其部署模式有公共链、联盟链、私有链三种,对应的是去中心化分布式系统、部分去中心化分布式系统和弱中心分布式系统。 在分布式系统中,多个主机通过异步通信方式组成网络集群。在这样的一个异步系统中,需要主机之间进行状态复制,以保证每个主机达成一致的状态共识。然而,异步系统中,可能出现无法通信的故障主机,而主机的性能可能下降,网络可能拥塞,这些可能导致错误信息在系统内传播。因此需要在默认不可靠的异步网络中定义容错协议,以确保各主机达成安全可靠的状态共识。 所谓共识,简单理解就是指大家都达成一致的意思。其实在现实生活中,有很多需要达成共识的场景,比如开会讨论,双方或多方签订一份合作协议等。而在区块链系统中,每个节点必须要做的事情就是让自己的账本跟其他节点的账本保持一致。如果是在传统的软件结构...
动态规划(DP)算法
参考https://blog.csdn.net/libosbo/article/details/80038549 动态规划是求解决策过程最优化的数学方法。利用各个阶段之间的关系,逐个求解,最终求得全局最优解,需要确认原问题与子问题、动态规划状态、边界状态、边界状态结值、状态转移方程。 以下每个例题,注意分析迭代关系是怎么找到的。一、爬楼梯leetcode70:Youareclimbingastaircase.Ittakes n stepstoreachtothetop.Eachtimeyoucaneitherclimb1or2steps.Inhowmanydistinctwayscanyouclimbtothetop?Note: Given n willbeapositiveinteger.Example1:Input:2Output:2Explanation:Therearetwowaystoclimbtothetop.1.1step+1step2.2stepsExample2:Input:3Output:3Exp...
经典算法之快速选择算法
相信快速排序算法这种经典的算法大家并不陌生。但是基于快速算法的各种变形,你了解吗? 其中很重要的一种变形就是快速选择算法, 通常用来在未排序的数组中寻找第k小/第k大的元素。快速选择及其变种是实际应用中最常使用的高效选择算法。 快速选择的总体思路与快速排序一致,选择一个元素作为基准来对元素进行分区,将小于和大于基准的元素分在基准左边和右边的两个区域。不同的是,快速选择并不递归访问双边,而是只递归进入一边的元素中继续寻找。这降低了平均时间复杂度,从O(n log n)至O(n),不过最坏情况仍然是O(n2)。 lc上一道题:Findthe kthlargestelementinanunsortedarray.Notethatitisthekthlargestelementinthesortedorder,notthekthdistinctelement. 下面的解法注释详细,能很好的理解快速选择算法,这个可以当作模版记下来。面试时能一次ac不出错吗?其实不是那么容易。记住的关键在于深刻的理解。 cl...
最小生成树之克鲁斯卡尔(kruskal)算法
前面讲了最小生成树的Prim算法的实现思路是,通过顶点的扩展不断地寻找最小权重的生成树,而Kruskal算法是查找最小权值的边,然后逐渐把连通分量变为一个联结全部顶点的最小生成树。不同于Prim算法,这次用边集数组结构来实现Kruskal算法 结构很简单,包括权值,边的弧起点和终点的下标将前面Prim例子中的图转化为边集数组,并且按照权值升序排列储存为edges[]这样一个数组,那么这样做的意义就在于后面按照权值的顺序来安排边,代码如下:1voidMiniSpanTree_Kruskal(MGraphG)2{3inti,n,m;4Edgeedges[MAXVEX];5intparent[MAXVEX];6//这里省略构造edges数组时的排序步骤代码7for(i=0;i<G.numVertexes;i++)8{9parent[i]=0;10}11for(i=0;i<G.numEdges;i++)12{13n=Find(parent,edges[i].begin);14m=Find(parent,edgws[i].end);15if(n!=m)16{17parent...
指派问题(匈牙利算法)
问题描述:在生活中经常遇到这样的问题,某单位需完成n项任务,恰好有n个人可承担这些任务。由于每人的专长不同,各人完成任务不同(或所费时间),效率也不同。于是产生应指派哪个人去完成哪项任务,使完成n项任务的总效率最高(或所需总时间最小)。这类问题称为指派问题或分派问题。指派问题也是0-1规划,线性规划用到的是官网scipy.optimize库函数。示例:costmatrix=[[1 43],[205],[322]]python解决方案中,用到的是scipy.optimize.linear_sum_assignment(cost_matrix)代码实现:fromscipy.optimizeimportlinear_sum_assignmentcost=np.array([[4,1,3],[2,0,5],[3,2,2]])row_ind,col_ind=linear_sum_assignment(cost)print(row_ind)#开销矩阵对应的行索引print(col_ind)#对应行索引的最优指派的列索引print(cost[row_ind,col_ind])#提取每个行索...
【算法】快速幂运算
在计算xn 时,我们会怎么算呢?如果只是x*x*x*...*x 这样每个数乘起来计算n次的的话,虽然算法简单,但是复杂度为 O(n) ,往往不能满足要求。让我们来考虑加速幂运算的方法。如果 n=2k ,可以将其表示为 xn=((x2)2)...,只要做k次平方运算就可以轻松求得。由此我们想到,先将n表示为2的幂次的和n=2k1+2k2+2k3 +...,就有xn=x2^k1 x2^k2 x2^k3 ...,只要在依次求x2^i 的同时计算就好了,最终得到了O(logn)计算幂运算的算法。比如计算x22,可以把x22 表示为x2 *x4*x16 (22转成二进制是10110)。在进行幂运算时,往往因为结果数字过大,而让我们输出取余后的结果。下面是一段参考代码:1typedeflonglongll;23llmod_pow(llx,lln,llmod){4llres=1;5while(n>0){6if(n&1)res=...
算法:拓扑排序
什么是拓扑排序 其实在写这篇博客的时候,我也是以一个学习者的角度出发的,目的就是想让自己理解和初步掌握拓扑排序。维基百科的定义如下: 在计算机科学领域,有向图顶点的线性排序就是其拓扑排序,例如,图形的顶点可以表示要执行的任务,并且边可以表示一个任务必须在另一个任务之前执行的约束;在这个应用中,拓扑排序只是一个有效的任务顺序。当且仅当图形没有定向循环,即如果它是有向无环图(DAG),则拓扑排序是可能的。任何DAG具有至少一个拓扑排序,并且已知这些算法用于在线性时间内构建任何DAG的拓扑排序。 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topologicalsorting)。每个顶点出现且只出现一次;若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B的前面。 比如在下图中,当然首先必须是有向无环图,从1出发到达,拓扑序列可以为1,3,2,5,4。 我们在写有向无环图的拓扑排序时遵循一种常用的方法:从DAG图中选择一个没有前驱(即入度为0)的顶点并输出。从图中删除该顶点和所有以它为起点的有向边。重复1和2...