
算法
文章平均质量分 79
midgard
简简单单,生活在世俗中的程序员。喜欢运动,尝试新鲜事务,但对新鲜技术有选择性的感冒。
展开
-
堆排序
要实现堆排序首先要理解堆相关的一些重要概念。 (1)什么是堆,堆于优先队列的关系? 堆实际上是优先队列数据结构的实现,也可以说,堆是具有优先队列性质的容器实现。 优先队列是允许下面两个操作的数据结构:InsertDeleteMin 即 DeleteMin 尤其要强调的是DeleteMin的操作,这步操作目的是找原创 2009-04-13 18:02:00 · 5209 阅读 · 2 评论 -
PageRank算法
总算有一个周末下午时间,决定亲手把pagerank算法实现一下。 之前只是看过思路,并一直使用同事的实现版本。 关于PageRank的介绍,请看http://zh.wikipedia.org/wiki/PageRankhttp://baike.baidu.com/view/1518.htm 不多废话了,直接进入正题,C++实现。公式采用:PR(A) = (1-d)原创 2011-12-11 20:25:22 · 12224 阅读 · 0 评论 -
大数幂运算
大数幂运算 源于POJ1001题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=1001这个题目可以从简单问题一步一步入手。1. 先仿效上一篇计算大整数加法,计算一个大整数与一个个位数字的乘积 string Mul_singleInt(const string& s1, int n);2. 循环利用大整数加法计算大整数乘积 string Mul_i原创 2009-10-24 21:49:00 · 4487 阅读 · 3 评论 -
所有点对的最短路径-FloydWarshall算法
找出所有点对的最短路径,经典算法是Floyd-Warshall,关于该算法,《算法导论》等书籍给了充分的推理介绍,但均显得过于理论化,阅读起来不容易理解。 以下我以一个例子,详细阐述该算法的解题过程,力图将跳跃性降至最低,所以只阐述算法实现过程,详细证明过程请还是参考书籍。 例图选择《算法导论》的图25-1: 首先要明确,这里的最短路径均为简单路径,即:一条路径最多每个顶原创 2009-07-02 01:57:00 · 11175 阅读 · 2 评论 -
大非负整数加法运算
大数运算是一类算法应用,在密码学中比较常用。这里先完成一个最基本,最简单的大数运算-大非负整数加法运算。大整数通常指计算结果超出int存储范围的,亦即会产生溢出的情况。比如32位无符号整数最大为:2^32-1=4294967295所以接下来的算法就是要完成诸如4294967200 + 4294967220 = 8589934420这样的运算。 解题步骤:首先原创 2009-07-30 15:15:00 · 2705 阅读 · 0 评论 -
找最近点对问题-分治算法的应用
分治算法的基本思想是: 分(divide):递归求解子问题,即:分解+求解,将问题分解为k个方便求解的小问题。 为什么说是递归求解呢,这里可以看作将一个问题分2个子问题,如果2个子问题还是大,再继续分成4个子问题,直到分解到能方便求解的小问题。也就是说分治算法是含有2个以上的递归运算,只有一个递归的例程不能算做分治算法。 治(conquer):从子问题构原创 2009-05-18 19:13:00 · 16321 阅读 · 12 评论 -
单源加权图最短路径问题2-BellmanFord算法
之前提到Dijkstra算法不能解决权值为负的情况。 Bellman-Ford算法能在更一般的情况下解决最短路径问题,即:允许权值为负。注意,最短路径问题实际上均不允许有负值回路(当然是从源点可达的),因为这时不存在最短路径。总会有更短的办法-多绕负边回路走几趟就是了。 首先介绍一下松弛技术(Relaxation)对每个顶点,都设置一个属性d[v], 用来描述从源点原创 2009-05-11 16:24:00 · 5093 阅读 · 1 评论 -
无权最短路径-广度优先搜索
图的搜索技术是图算法领域的核心。许多图算法的开始,都是通过搜索输入的图来获取图结构信息,另外还有些图的算法实际上是通过图搜索算法经过简单扩展而成的。广度优先搜索的执行方法:从任意点s出发,先遍历与s相邻的点,然后再遍历于相邻的点相邻的点。注意有向图必须是顺方向的邻接点。详细方法,参考任何数据结构书吧。不赘述了。为什么说广度优先搜索可以用来求无权最短路径呢?因为,广度优先搜索每次都会先发现距离s原创 2009-04-30 23:54:00 · 9126 阅读 · 2 评论 -
单源加权图最短路径问题(权值非负)-Dijkstra算法
解决单源最短路径的一个常用算法叫做:Dijkstra算法,这是一个非常经典的贪心算法例子。注意:这个算法只对权值非负情况有效。在每个阶段,Dijkstra算法选择一个顶点v,它在所有unknown顶点中具有最小的distance,同时算法将起点s到v的最短路径声明为known。这个算法的本质就是 给定起点,然后假设你有一个点集(known点集),对这个点集中的点,我们已经求出起点到其的原创 2009-05-05 17:24:00 · 10488 阅读 · 2 评论 -
拓扑排序
拓扑排序是对有向无环图的一种排序。表示了顶点按边的方向出现的先后顺序。如果有环,则无法表示两个顶点的先后顺序。在现实生活中,也会有不少应用例子,比如学校课程布置图,要先修完一些基础课,才可以继续修专业课。一个简单的求拓扑排序的算法:首先要找到任意入度为0的一个顶点,删除它及所有相邻的边,再找入度为0的顶点,以此类推,直到删除所有顶点。顶点的删除顺序即为拓扑排序。 很容易得到拓扑排原创 2009-04-22 17:07:00 · 36289 阅读 · 18 评论 -
构建一个图
在练习图的各种算法时,比如深度优先搜索,拓扑排序,最短路径,最小生成树等等,都希望得到有效的验证,这就必须先自己构建出图的存储结构。才能将图实例信息用于算法验证。要完整的构建一个图比较复杂,这里只是给出一个非常简单的例子,讲述如何使用邻接表构建一个图。基本是C语言实现。 此例,我们认为v1-v7的位置信息为 1-7,即v1位置为1,v2位置为2,。。。原创 2009-04-21 09:42:00 · 2883 阅读 · 0 评论 -
快速排序
排序算法是各种笔试,面试最常考到的一类题目,提到排序,一定会要求提供一种高效的方法,所以就不得不说一下快速排序了。快嘛!写出快速排序一定要先理解什么是枢纽元(pivot),枢纽元就是每次执行快排需要参照的那个元素。最常见的选择pivot的方法是选择第一个元素。此外还有最后一个元素,随机选择,中值法等等。比如 20,34,4,53,43,42,6,67,193 选择20为pivot经过原创 2009-04-09 16:51:00 · 7597 阅读 · 11 评论 -
如何构建二叉树
说干就干,先上一篇昨天写的文章。 以一道题目来说明如何建立二叉树。 题目:已知先序遍历,中序遍历 建立二叉树,然后求后序遍历。 e.g. 先序:a b d e i j c f g 中序:d b i e j a f c g 后序:d i j e b f g c a //期望结果 解法:先序中的首元素a 必为该二叉树的根结点原创 2009-04-09 10:18:00 · 18117 阅读 · 1 评论 -
深入学习算法的一点拙见
今天实在是头脑不听使唤了,没力气看书,写代码了。写点总结吧。都说算法是内功,究竟练到什么程度才算修成了呢? 为什么要学习,强化算法?首先强调的是,下面的原因均是建立在算法熟练到一定程度后的效果。不熟的话,未见得能达到效果。这些原因很现实。但很多程序员却不知道或不以为然。比较世俗的方面,顶级软件公司笔试,面试会问到。别说你不想去谷歌,百度,微软,如果真的没想过,我希望你能原创 2009-04-16 17:33:00 · 4054 阅读 · 6 评论 -
图的存储结构
图的基本概念http://hi.baidu.com/%C8%ED%BC%FE%B8%D6%C7%D9%CA%A6/blog/item/f7b50c07791b8ec57a8947ec.html 图,无向图G = (V, E)有向图 G = V是点集vertex, E是边集edge 图通常有两种存储方法。邻接矩阵, 多用于稠密图,记录每两个顶点之间边原创 2009-04-15 17:45:00 · 7187 阅读 · 2 评论 -
如何使用ACM练习算法
简单介绍下ACM,汗!还得现搜索一下。ACM(Association for Computing Machinery)国际计算机组织通常说的ACM是指 ACM国际大学生程序设计竞赛基本可以看作是写各种算法的比赛。 国内常用的ACM练习站:北大的比较有人气。http://acm.pku.edu.cn/JudgeOnline/刚刚注册了下,体验了一下流程。1 先Register原创 2009-04-14 16:40:00 · 7448 阅读 · 0 评论 -
二叉排序树binary_sort_tree
当你希望获取快速的查找时间,快速的插入删除时间,并且遍历是有序的 数据结构, 你需要的就是二叉排序树了。AVL二叉平衡树,红黑树都是binary sort tree, 这就是STL中的map为什么(中序)遍历,key是有序输出的原因!注意: 二叉排序树,平均插入,查找O(logn), 但如果不平衡,极端情况,查找为O(n), 一棵斜树。 所以,利用平衡可以提高效率。为了简化,原创 2011-12-24 14:29:56 · 3980 阅读 · 0 评论