算法
文章平均质量分 78
A20180825
233333
展开
-
带权最短路 Dijkstra、SPFA、Bellman-Ford、ASP、Floyd-Warshall 算法分析
图论中,用来求最短路的方法有很多,适用范围和时间复杂度也各不相同。本文主要介绍的算法的代码主要来源如下:Dijkstra: Algorithms(《算法概论》)Sanjoy Dasgupta, Christos Papadimitriou, Umesh Vazirani;《算法竞赛入门经典—训练指南》刘汝佳、陈峰。SPFA (Shortest Path Faster Algorithm): Data转载 2017-08-07 08:47:20 · 51750 阅读 · 0 评论 -
图论五百题
图论五百题转载 2017-08-06 07:09:30 · 3056 阅读 · 0 评论 -
最小生成树之Kruskal算法
给定一个无向图,如果它任意两个顶点都联通并且是一棵树,那么我们就称之为生成树(Spanning Tree)。如果是带权值的无向图,那么权值之和最小的生成树,我们就称之为最小生成树(MST, Minimum Spanning Tree)。 我们由最小生成树的定义,可以延伸出一个修建道路的问题:把无向图的每个顶点看作村庄,计划修建道路使得可以在所有村庄之间通行。把每个村庄之间修建道路的费用转载 2017-08-06 07:07:20 · 6616 阅读 · 0 评论 -
拓扑排序的原理及其实现
本文将从以下几个方面介绍拓扑排序:拓扑排序的定义和前置条件和离散数学中偏序/全序概念的联系典型实现算法Kahn算法基于DFS的算法解的唯一性问题实际例子取材自以下材料:http://en.wikipedia.org/wiki/Topological_sortinghttp://en.wikipedia.org/wiki/Hamiltonian_path定义和前置条件:定义:将有向图中的顶转载 2017-08-06 06:59:23 · 997 阅读 · 0 评论 -
拓扑排序的原理及实现
拓扑排序,顾名思义,就是一种排序方法。这是一种什么排序?这种排序的作用?然后怎么去实现这种排序算法?现在就让我们仔细研究下。1、什么是拓扑排序,也就是拓扑排序的概念实际上,拓扑排序是一种图论算法,该算法在《数据结构与算法》一书中有涉猎。引用维基百科的定义:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting)。转载 2017-08-05 14:06:27 · 25063 阅读 · 6 评论 -
动态规划总结
终于来到了算法设计思想中最难,也最有趣的这部分,在去年的google笔试中,7道算法设计题有2道动态规划(Dynamic Programming)。看了这么久的算法,这部分也是唯一感觉到了比较难的地方,从这篇文章开始,将花连续的篇幅来讨论一些动态规划的问题。这包括书上介绍过的计算二项式系数,Warshall算法求传递闭包,Floyd算法求完全最短路径,构造最有二叉查找树,背包问题和记忆功能。也包括一转载 2017-08-05 13:42:12 · 10185 阅读 · 0 评论 -
拓扑排序
拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(TopoiSicai Order)的序列,简称拓扑序列。转载 2017-08-05 14:05:00 · 7988 阅读 · 0 评论 -
拓扑排序的原理及其实现
本文将从以下几个方面介绍拓扑排序:拓扑排序的定义和前置条件和离散数学中偏序/全序概念的联系典型实现算法Kahn算法基于DFS的算法解的唯一性问题实际例子取材自以下材料:http://en.wikipedia.org/wiki/Topological_sortinghttp://en.wikipedia.org/wiki/Hamiltonian_path定义和前置条件:定义:将有向图中的顶转载 2017-08-05 14:01:52 · 12410 阅读 · 0 评论 -
几个经典的动态规划算法
动态规划~背包问题最大子数组和问题转载 2017-08-05 13:58:15 · 45973 阅读 · 2 评论 -
动态规划入门
学动态规划自然要从数字三角形开始起步,那么我们就先从数字三角形开始。数字三角形题目:有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外的每个数的左下方和右下方各有一个数,如下图所示:13 24 10 14 3 2 20从第一行的数开始,每次可以往下或往右下走一格,直到走到最下行,把沿途经过的数全部加起来。如何走才能使这个和最大?知道回溯法么(请参看:八皇后与回溯法),你转载 2017-08-05 13:53:44 · 5346 阅读 · 0 评论 -
动态规划总结与题目分类
源博客链接:http://blog.csdn.net/cc_again/article/details/25866971动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力、建模抽象能力、灵活度。动态规划(英语:Dynamic programming,DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解转载 2017-08-05 13:52:06 · 1643 阅读 · 0 评论 -
很特别的动态规划教程——通过金矿模型介绍动态规划
很特别的一个动态规划入门教程附上原文地址:http://www.cnblogs.com/sdjl/articles/1274312.html通过金矿模型介绍动态规划 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,转载 2017-08-05 13:49:25 · 553 阅读 · 0 评论 -
最小生成树之Prim算法
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克发现;并在1957年由美国计算机科学家罗伯特·普里姆独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆转载 2017-08-06 07:11:05 · 6895 阅读 · 0 评论 -
最小生成树——Kruskal算法
最小生成树之kruskal算法转载 2017-08-06 07:15:06 · 2316 阅读 · 0 评论 -
Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
Dijkstra:适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV)BellmanFord:适用于权值有负值的图的单源最短路径,并且能够检测负圈,复杂度O(VE)SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度O(kE),k为每个节点进入Queue的次数,且k一般<=2,但此处的复杂度证明是有问题的,其实SPFA的最坏情况应该是O(VE).转载 2017-08-07 08:43:01 · 44644 阅读 · 0 评论 -
图的最短路径:Dijkstra、Bellman-Ford、SPFA、Floyd、A*算法
图的表示方式:邻接矩阵、邻接表SPFA、Bellman-Ford、Dijkstra、A*算法转载 2017-08-07 08:41:03 · 50344 阅读 · 0 评论 -
最短路算法详解(Dijkstra/SPFA/Floyd)
最短路算法详解:Dijkstra、SPFA、Floyd转载 2017-08-07 08:38:08 · 16777 阅读 · 0 评论 -
SPFA算法详解
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。 我们约定有向加权图G不存在负权回路,即最短路径一定存在。当然,我们可以在执行该算法前做一次拓扑排序,以判断是否存在负权回路,但这不是我们讨论的重点。算法思想:我们用数组d记录每个结点的最短路径估计值,用邻接表来存储图G。转载 2017-08-07 08:34:24 · 9951 阅读 · 0 评论 -
SPFA算法 求单源最短路
SPFA算法为了简便,我们约定图中不存在负权回路,这可以通过一次拓扑排序知道。SPFA实际是Bellman-Ford算法的一种队列实现,用一个数组来保存最短路径的估计值,初始时将源加入队列,每次从队列中取队头元素,并对所有与其相邻的结点进行松弛操作,如果该点的估计值有所调整,且该点不在队列中,则入队,如此反复,直到队空。转载 2017-08-07 08:32:40 · 990 阅读 · 0 评论 -
动态规划题目总结
动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力、建模抽象能力、灵活度。转载 2017-08-05 13:46:32 · 8000 阅读 · 2 评论 -
最短路算法
最短路径问题旨在寻找图中两节点之间的最短路径,常用的算法有以下四种。注意是把图处理成无向还是有向Dijkstra’s (权值非负)1 Dijkstra’s算法解决的是图中单个源点到其它顶点的最短路径。只能解决权值非负2 Dijkstral只能求出任意点到达源点的最短距离(不能求出任意两点之间的最短距离),同时适用于有向图和无向图,复杂度为O(n^2).3算法的过程: 1设置顶点集合S并不断的转载 2017-08-06 07:25:33 · 1424 阅读 · 0 评论 -
Prim算法和Kruskal算法
Prim算法和Kruskal算法都能从连通图找出最小生成树。区别在于Prim算法是挨个找,而Kruskal是先排序再找。转载 2017-08-06 07:21:42 · 20831 阅读 · 2 评论 -
c++ 最小生成树——Prim和Kruskal理解与分析
最小生成树(MST:minimum-cost spanning tree)转载 2017-08-06 07:16:27 · 6704 阅读 · 0 评论 -
最小生成树Prim算法理解
MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U-V中找到另一点c使得点c到V中任意转载 2017-08-06 07:19:20 · 1245 阅读 · 0 评论 -
教你彻底学会动态规划
动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙述概念,讲解原理,让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的时候又会觉得无所适从。我觉得,理解算法最重要的还是在于练习,只有通过自己练习,才可以更快地提升。话不多说,接下来,下面我就通过一个例转载 2017-08-05 13:39:40 · 7159 阅读 · 0 评论 -
白话经典算法系列之十二 数组中只出现一次的两个数字(百度面试题)
微博http://weibo.com/MoreWindows已开通,欢迎关注。本系列文章地址:http://blog.csdn.net/MoreWindows/article/category/859207首先来看题目要求:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。 考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找转载 2017-08-04 09:17:50 · 1731 阅读 · 0 评论 -
计数排序、桶排序和基数排序
计数排序当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是转载 2017-08-03 10:16:53 · 1502 阅读 · 0 评论 -
十种常见的排序算法
1.常见算法分类十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序(二路归并排序和多路归并排序);(2)线性时间非比较类排序:计数排序、基数排序和桶排序。总结: (1)在比较类排序中,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有一点需要注意,数据初始转载 2017-08-03 10:12:16 · 14910 阅读 · 0 评论 -
啊哈!算法 第1章 一大波数正在靠近——排序
好好学习天天向上。原创 2017-07-04 15:42:14 · 4324 阅读 · 0 评论 -
动态规划:从新手到专家
前言我们遇到的问题中,有很大一部分可以用动态规划(简称DP)来解。 解决这类问题可以很大地提升你的能力与技巧,我会试着帮助你理解如何使用DP来解题。 这篇文章是基于实例展开来讲的,因为干巴巴的理论实在不好理解。注意:如果你对于其中某一节已经了解并且不想阅读它,没关系,直接跳过它即可。简介(入门)什么是动态规划,我们要如何描述它?动态规划算法通常基于一个递推公式及一个或多个初始状态。 当前子问题的解将转载 2017-08-02 23:13:05 · 8558 阅读 · 0 评论 -
背包九讲
第一讲 背包问题第二讲 完全背包问题第三讲 多重背包问题第四讲 混合三种背包问题第五讲 二维费用的背包问题第六讲 分组的背包问题第七讲 有依赖的背包问题第八讲 泛化物品第九讲 背包问题问法的变化转载 2017-08-02 23:17:32 · 48997 阅读 · 0 评论 -
堪称最好的A*算法
译序这篇文章很适合A*算法的初学者,可惜网上没找到翻译版的。本着好东西不敢独享的想法,也为了锻炼一下英文,本人译了这篇文章。由于本人英文水平非常有限,六级考了两次加一块不超过370分,因此本译文难免存在问题。不过也算是抛砖引玉,希望看到有更多的游戏开发方面的优秀译作出现,毕竟中文的优秀资料太少了,中国的游戏开发者的路不好走。本人能力有限,译文中有小部分词句实在难以翻译,因此暂时保留英文原文放在转载 2017-08-03 09:59:42 · 12388 阅读 · 0 评论 -
八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时转载 2017-08-03 10:03:49 · 6687 阅读 · 0 评论 -
排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均转载 2017-08-03 10:09:06 · 1751 阅读 · 0 评论 -
图的遍历、最小生成树、最短路径
数据结构和算法系列17 图 阅读目录一,图的定义二,图相关的概念和术语三,图的创建和遍历四,最小生成树和最短路径五,算法实现这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结: 1,图的定义? 2,图相关的概念和术语? 3,图的创建和遍历? 4,最小生成树和最短路径?转载 2017-08-09 21:53:58 · 15025 阅读 · 0 评论 -
数据结构:图的存储、图的遍历、最小生成树、最短路径、拓扑排序
一、基本术语图:由有穷、非空点集和边集合组成,简写成G(V,E);Vertex:图中的顶点;无向图:图中每条边都没有方向;有向图:图中每条边都有方向;无向边:边是没有方向的,写为(a,b)有向边:边是有方向的,写为<a,b>有向边也成为弧;开始顶点称为弧尾,结束顶点称为弧头;简单图:不存在指向自己的边、不存在两条重复的边的图;无向完全图:每个顶点之间都有一条边的无向图;有向完全图:转载 2017-08-09 21:49:54 · 21884 阅读 · 0 评论 -
数据结构:图——图的遍历、最小生成树、最短路径算法
前言在这里,如果大家对图或者数据结构还不太熟悉,想找一个动态的生成过程来参考,这是一个不错的网站.知识框架图的定义在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关转载 2017-08-09 21:46:13 · 48705 阅读 · 0 评论 -
白话经典算法系列之七 堆与堆排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想—-分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定转载 2017-08-04 08:45:57 · 6223 阅读 · 0 评论 -
白话经典算法系列之五 归并排序的实现
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plain copy print?//将有序数组a[]和转载 2017-08-03 10:23:37 · 1596 阅读 · 0 评论 -
白话经典算法系列之四 直接选择排序及交换两个数据的正确实现
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。 设数组为a[0…n-1]。1. 初始时,数组全为无序区为a[0..n-1]。令i=02. 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a转载 2017-08-03 10:21:44 · 1325 阅读 · 0 评论