图论之最短路径floyd算法

Floyd算法是图论中经典的多源最短路径算法,即求任意两点之间的最短路径。 它可采用动态规划思想,因为它满足最优子结构性质,即最短路径序列的子序列也是最短路径。  举例说明最优子结构性质,上图中1号到5号的最短路径序列<1,2,4,5>,其子序列<1,2,4>也是最短路径。在动态规划算法中,处于首要位置、且也是核心理念之一的就是状态的定义。动态转移的基本思想可以认为是建立起某一状态和之前状态的一种转移表示。d[k][i][j]定义为“只能使用第1号到第k号点作为中间媒介时,点i到点j之间的最短路径长度”。按照前面的定义,d[k][i][j]是一种使用1号到k号点的状态,可以想办法把这个状态通过动态转移,规约到使用1号到(k-1)号的状态,即d[k-1][i][j]。对于d[k][i][j](即使用1号到k号点中的所有点作为中间媒介时,i和j之间的最短路径),可以分为两种情况:(I)i到j的最短路不经过k;(II)i到j的最短路经过了k。不经过点k的最短路情况下,d[k][i][j]=d[k-1][i][j]。...

社会网络分析之连通分量分组算法

0.引言在社会网络分析领域,非常重要的一块就是寻找网络中的有联系的小团体,比较正式的说法是“成分”。通常将图论中最大的连通分量定义为“成分”,成分内部的各点之间必然有一条途径相连,而成分之外的点与成分内部的点没有联系。 1.概念连通分量是图论非常重要的一个概念。与它有一个相近的概念,叫连通图。对于初学者而言,很容易混淆这两个概念。(1)连通图是相对整体而言的,连通分量是相对局部子集而言。(2)连通图只有一个连通分量即本身,非连通的无向图有多个连通分量。(3)连通分量内部任意两点之间都可达例如:上图是无向图G4,有两个连通分量H1、H2,H1、H2内部任意两点都可达。2.分组算法思路1:对于任意给定的无向图G。step1:随机从中取出一个节点X,添加到集合S1。以x为起点进行广度搜索,将有连接的节点Y和边E添加到集合S1,并将节点E标志位设置为已访问。step2:从G中剔除集合S1中所有的节点。step3:重复step1、step2操作,直到G中的节点数为0,由此生成了分组S1、S2......Sn。1/**2*根据连通划分分组3...

树布局算法(翻译)

比尔.米尔当我需要为某个项目绘制一些树时,我认为绘制整齐树木会有一个经典而简单的算法。我发现的更有趣得多:树布局不仅是一个NP完全问题1,但树绘图算法背后有一个漫长而有趣的历史。我将使用树绘图算法的历史来逐一介绍核心概念,使用它们来构建一个完整的O(n)算法,以绘制一颗迷人的树。这里有什么问题? 图1给定一棵树T,我们要做的就是绘制它,这样观众就会发现它很有吸引力。本文中介绍的每种算法的目标都是为树的每个节点分配一个(x,y)坐标,以便在算法运行后将其绘制到屏幕上或打印出来。为了存储树绘图算法的结果,我们将创建一个DrawTree数据结构来镜像我们正在绘制的树; 我们唯一假定的是每个树节点都可以迭代其子节点。清单1中可以找到DrawTree的基本实现。classDrawTree(object):   def__init__(self,tree,depth=0):       self.x=-1      &n...
代码星球 代码星球·2020-04-04

布局算法之树布局

在数据可视化领域,常常需要将数据按照一定的规则分布,使得数据展示直观、清晰、一目了然。笔者在工程实践时,遇到这样一个问题:如何使得具有多个关系联系的点边图按照树形布局?在查阅了大量国内外资料的基础上,笔者找到了BillMill的一篇英文论文:drawingpresentabletrees。在这里先简单地描述一下算法的大概思路:该算法采用深度优先的方式遍历整个多叉树。第一步:如果是叶子节点则其x坐标等于其左兄弟的x坐标加上间距distance,如果是非叶子节点则其x坐标等于其左兄弟的x坐标加上间距distance,同时记录下偏移量(x坐标与子节点的中点之差)。第二步:将所有的子节点按父节点的偏移量移动。第三步:计算多叉树的轮廓,如果轮廓值小于0则说明左右子树存在重叠,将右子树偏移该轮廓值。此外,分享一下我的翻译结果:http://www.cnblogs.com/zhongzihao/p/8976675.html。...
代码星球 代码星球·2020-04-04

图论算法之DFS与BFS

概述(总)DFS是算法中图论部分中最基本的算法之一。对于算法入门者而言,这是一个必须掌握的基本算法。它的算法思想可以运用在很多地方,利用它可以解决很多实际问题,但是深入掌握其原理是我们灵活运用它的关键所在。含义特点DFS即深度优先搜索,有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。由于用到递归,当节点特别多且深度很大的时候,可能会发生栈溢出。解决办法是将递归改为非递归,自行编写栈。BFS即广度优先搜索(也称宽度优先搜索),是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名。 一般可以用它做什么呢?一个最直观经典的例子就是走迷宫,我们从起点开始,找出到终点的最短路程,很多最短路径算法就是基于广度优先的思想成立的。应用场景dfs连通分量连通分量:任意两点可互达的图。求无向图的连通分量:O(n)二分图判定二分图:每条边的两个节点分别着不同的两种颜色。判断一个图是否...
代码星球 代码星球·2020-04-04

图论之最短路径算法

简介:求最短路径算法中最具代表性的是Dijkstra算法。Dijkstra算法的思想是基于贪心策略的。概述其过程是通过设置顶点集合S并不断地做贪心选择来扩充集合。贪心选择的标准是每次都选择从源节点到该节点的路径长度最短。 难点:网络上博客中大多数人写的最短路径算法大多都是只能寻找到最短的一条路径。但是很多时候可能存在并列最短的路径,需要找出所有同时最短的路径。在这里我给大家分享一个时间复杂度大概是O(n2)的算法,求并列最短路径算法。 求出一条最短路径的算法步骤如下:假设G={V,E}1.初始时令S={V0},T=V-S={其余顶点},dist[当前节点]=v0到当前节点之间权重,pre[当前节点]=v02.从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中3.对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值dist[Vi]=新值,Pre[Vi]=w4.重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止 代码实现:int arcs[10][10];//邻接矩阵int D[10...
代码星球 代码星球·2020-04-04

力导向算法研究

 一、背景1963年,Tutte提出的质心法被公认为是第一个事实上的力导向算法。1984年,Eades提出了一种电荷弹簧模型,以带电环代替图的顶点, 弹簧代替图的边, 尝试用物理方法画图,从而开拓了力导向算法的新思路。该算法首先为图中各顶点赋予随机的初始位置,然后系统在电荷之间的斥力和弹簧的弹力作用下,不停地运动, 直至达到稳定平衡的状态。 其中力导向算法是属于信息可视化范畴内的一种经典算法。而可视化发展的三个方向:科学可视化、信息可视化和可视分析。其中图的布局策略往往决定了整个图的展示效果。布局策略有很多种,诸如力导向布局、树布局、群组布局、光谱布局(SpectralLayout)。信息可视化的目标是图画迅速且清晰地传达其背后信息的能力,平面图以及美学、算法效率等则构成评价算法优良的尺度。 Purchase总结了目前业内公认的一般美学原则:(1)最小化边交叉(EdgeCrossing),即任意两条边交叉于一点的情况应尽量少发生;(2)最小化边弯曲(EdgeBend),即应尽量避免产生弯曲的边;(3)最大化对称性;(4)最大化...
代码星球 代码星球·2020-04-04

Java中的数据结构

以下内容引用自http://wiki.jikexueyuan.com/project/java/data-structures.html:Java工具包中所提供的数据结构非常强大并且有很多的功能。这些数据结构包含以下的接口和类:EnumerationBitSetVectorStackDictionaryHashtableProperties现在这些类都是旧的了,Java-2已经引入了一种新的框架叫做CollectionsFramework。一、Enumeration枚举接口本身并不是一个数据结构,但是它在其他数据结构中非常重要。TheEnumeration接口定义了一种方法可以从一个数据结构中连续获取元素。例如,Enumeration定义了一个叫做nextElement的方法,它可以用来在一个包含很多元素的数据结构中获得下一个元素。二、BitSetBitSet类实现了一组bits或flags,可以被独立的设置和清除。在需要保存一组布尔值的时候这个类非常有用;只需要给每个值或集合赋值一个bit并且可以视情况设置或清除它。三、VectorVector类和传统的Java数组类似,但是它可以增...
代码星球 代码星球·2020-04-04

CareerCup All in One 题目汇总

  Chapter1.ArraysandStrings1.1UniqueCharactersofaString1.2ReverseString1.3PermutationString1.4ReplaceSpaces1.5CompressString1.6RotateImage1.7SetMatrixZeroes1.8StringRotation Chapter2.LinkedLists2.1RemoveDuplicatesfromUnsortedList2.2KthtoLastElementofLinkedList2.3DeleteNodeinaLinkedList2.4PartitionList2.5AddTwoNumbers2.6LinkedListCycle2.7PalindromeLinkedList Chapter3.StacksandQueues3.1ImplementThreeStacksusingArray3.2MinStack3.3SetofStacks3.4TowersofHanoi3.5ImplementQueueusing...

LeetCode高频题目(100)汇总-Java实现

    【Leetcode-easy-1】TwoSum【Leetcode-easy-2】AddTwoNumbers【Leetcode-easy-3】LongestSubstringWithoutRepeatingCharacters【Leetcode-easy-5】LongestPalindromicSubstring【Leetcode-easy-11】ContainerWithMostWater【Leetcode-Easy-20】ValidParentheses【Leetcode-Easy-21】MergeTwoSortedLists【Leetcode-Medium-22】GenerateParentheses【Leetcode-Medium-46】Permutations【Leetcode-Easy-53】MaximumSubarray【Leetcode-Easy-70】ClimbingStairs【Leetcode-Medium-94】BinaryTreeInorderTraversal【Leetcode-Easy-101】Symmetri...

关系型数据库工作原理-数据结构(翻译自Coding-Geek文章)

   本文翻译自Coding-Geek文章:《Howdoesarelationaldatabasework》。 原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 本文翻译了如下章节:  通过前面的章节,我们已经理解了时间复杂和归并排序的概念,接下来我要介绍三种数据结构。这三种数据结构非常重要,它们是现代数据库系统的基石。我也会讲一讲数据库索引的概念。二位数组是一种最简单的数据结构,一张数据库表就可以看成是一个二维数组。例如: 这个二维数组就代表一张有行和列的表结构: 每一行代表一个对象每一行所有列的数据代表了一个对象的所有属性每一列固定存储某一种类型的数据(如:integer、string、date…)。尽管,二维数组用于存储表数据非常好,但是当你需要从数组中根据某个条件查询数据时,性能无法接受。例如:你想找出在英国工作的所有人,你需要遍历每一行数据,判断他是否属于英国。这个过程...

Quorum机制与NRW算法总结

     Quorum,原指为了处理事务、拥有做出决定的权力而必须出席的众议员或参议员的数量(一般指半数以上)。     NRW算法是基于Quorum机制的是一种CP(Consistency&Partiontolerance)算法。用于在数据一致性和可靠性之间达到一种平衡。为了保证系统的正常运行,能够提供可靠的服务,分布式系统中对于数据的存储采用多份数据副本,但是这种解决方案在数据读写的过程中会造成数据的不一致性。我们知道要解决数据一致性问题,就是数据的处理方式采用ReadOnlyWriteAll原则,即在分布式环境中,所有节点更新完毕后,读操作才能进行,保证数据的强一致性。这种虽然保证了数据的在某一刻的强一致性,但是极其影响系统的性能。在一个读操作非常频繁的分布式环境中,写操作的耗时,直接阻塞了读的操作。导致读和写的负载不均衡。      基于Quorum机制的NRW算法就是在读和写的负载上达到一定平衡的同时,保证数据...

常见排序算法题(java版)

常见排序算法题(java版)org.rut.util.algorithm.support; /** *@version1.0publicimplements/**(non-Javadoc)     publicintintfori=            int)&&(data[j]<data[j-                );        } for;i<arr.length;i++){   (varj=i+1iftemp=arr[i];    &...
代码星球 代码星球·2020-04-03

树的算法总结

树的算法总结1.决策树下面简述一下生成决策树的步骤:(1)根据给定的训练数据,根据熵最大原则根据每一个维度来划分数据集,找到最关键的维度。(2)当某个分支下所有的数据都数据同一分类则终止划分并返回类标签,否则在此分支上重复实施(1)过程。(3)依次计算就将类标签构建成了一棵抉择树。(4)依靠训练数据构造了决策树之后,我们就可以将它用于实际数据的分类。ps:当然生成决策树的算法不止这一个,还有其他一些生成决策树的方法,比如:C4.5和CART   2.随机森林因此,随机森林的训练过程可以总结如下:(1)给定训练集S,测试集T,特征维数F。确定参数:使用到的CART的数量t,每棵树的深度d,每个节点使用到的特征数量f,终止条件:节点上最少样本数s,节点上最少的信息增益m对于第1-t棵树,i=1-t:(2)从S中有放回的抽取大小和S一样的训练集S(i),作为根节点的样本,从根节点开始训练(3)如果当前节点上达到终止条件,则设置当前节点为叶子节点,如果是分类问题,该叶子节点的预测输出为当前节点样本集合中数量最多的那一类c(j),概率p为c(j)占当前样本集的比例;...
代码星球 代码星球·2020-04-03

机器学习树的算法总结

1.决策树骤如下:(1):假设T为训练样本集。(2):从属性集合Attributes中选择一个最能区别T中样本的属性。(3):创建一个树节点,它的值为所选择的属性。创建此节点的子节点,每个子链代表所选属性的一个唯一值(唯一区间),使用子链的值进一步将样本细分为子类。对于每一个分支继续重复(2)(3)的过程,直到满足以下两个条件之一:(a):所有属性已经被这条路径包括。(b):与这个节点关联的所有训练样本都具有相同的目标属性(熵为0)。    2.随机森林1.假设我们设定训练集中的样本个数为N,然后通过有重置的重复多次抽样来获得这N个样本,这样的抽样结果将作为我们生成决策树的训练集;2.如果有M个输入变量,每个节点都将随机选择m(m<M)个特定的变量,然后运用这m个变量来确定最佳的分裂点。在决策树的生成过程中,m的值是保持不变的;3.每棵决策树都最大可能地进行生长而不进行剪枝;4.通过对所有的决策树进行加总来预测新的数据(在分类时采用多数投票,在回归时采用平均)。   3.AdaboostAdaboost的简单版...
代码星球 代码星球·2020-04-03
首页上一页...126127128129130...下一页尾页