代码改变世界

随笔分类 -  5、模式与算法

排序网络(C#模拟)

2012-08-04 17:23 by java线程例子, 195 阅读, 收藏,
摘要: 排序网络利用比较器进行简单的组合形成排序网络,利用并行方式执行,可以实现高效的排序算法,排序网络如果用软件实现,其实没有什么大的意义,因为目前的计算机虽然有多核,也可以用多线程,在一定程度上实现真正的并行,但其并行能力相对于稍具规模的排序网络来说都是有限的.排序网络用硬件来实现就非常具有优势了,排序网络的基本单元比较器的结构非常简单,适合大规模应用,还可以模块化.在组成比较排序网络后,在有限的时钟周期序列下就可以完成输入序列的排序(不需要通常系统意义下的并行).在规模为n的排序网络中,序列长度1-n的序列排序用时是一样的.当然,排序网络用硬件实现的一个缺点就是排序规模n扩展比较困难.对于现代的 阅读全文

单源最短路径算法(有向无回路)

2012-08-01 21:18 by java线程例子, 322 阅读, 收藏,
摘要: /// <summary> /// 有向无回路图中的单源最短路径算法 /// </summary> public class DAG_Shortest_Paths { /// <summary> /// 有向无回路图中的单源最短路径 /// </summary> /// <param name="g">有向无回路图</param> /// <param name="s">源点s</param> public void DAGShortestPaths(Grap 阅读全文

单源最短路径算法(BellmanFord算法)

2012-08-01 21:13 by java线程例子, 500 阅读, 收藏,
摘要: /// <summary> /// 单源最短路径BellmanFord算法 /// </summary> public class BellmanFordAlg { /// <summary> /// 单源最短路径算法(BellmanFord算法) /// </summary> /// <param name="g">图</param> /// <param name="s">原点</param> /// <returns></returns 阅读全文

单源最短路径算法(Dijkstra算法)

2012-08-01 21:09 by java线程例子, 311 阅读, 收藏,
摘要: 1、图形相关类(前面有个,但这里增加了一些属性) /// <summary> /// 图类,由节点和边构成. /// </summary> public class Graphic { /// <summary> /// 用于图形访问临时公共变量 /// </summary> public int FinishOrder { get; set; } /// <summary> /// 用于图形访问临时公共变量 /// </summary> public int... 阅读全文

几个有关图的算法2(DFS,TopoLogicalSort) .

2012-07-09 22:36 by java线程例子, 325 阅读, 收藏,
摘要: 深度优先算法和拓扑算法是很多算法的基础,只得深究:/// <summary> /// 广度搜索算法,图 /// </summary> public partial class GraphicSearchAlg { /// <summary> /// 深度优先搜索算法,这里只是计算深度. /// </summary> /// <param name="g">图,基于邻接表示</param> /// <param name="s">源点</param> publi 阅读全文

最小优先级队列(基于最小二叉堆算法)

2012-06-27 22:03 by java线程例子, 426 阅读, 收藏,
摘要: 在最小生成树Prim算法中,可以利用最小优先级队列来改善时间复杂度,同时在单源最短路径Dijkstra算法中也同样可以利用这种最小优先级队列来改善算法时间复杂度。实现最小优先级队列可以有很多种方式,比如基于二叉最小堆,或者斐波那契堆等。这里是二叉最小堆的C#实现,原理是根据书上的伪代码来的,但有些地方我做了改进,比如书key值改变,原来书上只能变大,这里取掉了这个限制。同时还提供了根据卫星值来选择元素的功能,下面是代码: /// <summary> /// 队列元素包装类 /// </summary> /// <typeparam name="T&quo 阅读全文

最小生成树算法(类Prim算法的笨办法)

2012-06-24 16:46 by java线程例子, 296 阅读, 收藏,
摘要: 这个算法是我自己想的最笨最原始的算法,原理跟Prim类似,但不同的是这里不用处理最小优先级队列,当然算法的时间复杂度要高些(该算法针对的是无向连通图,对于有向连通图,算法原理一样,但算法代码需要做一些处理),下面看代码:1、类和树的定义可参考前面的博文。2、算法类:public class PrimAlg { public Tree MST_SimpleAlg(Graphic g,Node root) { Tree theMST = new Tree(); //最小生成树节点 Dictionar... 阅读全文

最小生成树算法(Kruskal算法)

2012-06-24 16:38 by java线程例子, 355 阅读, 收藏,
摘要: 算法导论看到一半,觉得还是有必要继续看,边看边试试,下面是最小生成树的Kruskal算法,这个算法原理看起来很复杂,但实现起来很简单:开始的时候是每个顶点一棵树,并将边按权重升序排列。然后从前到后按循序选边,如果当前选择的边的两个顶点分在两棵不同的树中,则将该边加入到最小生成树中,并合当前边连接的两棵树,如果边得两个顶点在相同的树中,则不做任何处理,需要注意的是这个算法是针对无向连通图的,如果是有限图,则需要在算法中做些处理,但算法原理是一样的。看代码:1、树和图相关类 /// <summary> /// 图类,由节点和边构成. /// </summary> publi 阅读全文

用DotNet做简单的分布式计算的几个关键技术点

2012-02-03 21:39 by java线程例子, 294 阅读, 收藏,
摘要: hadoop的数据流分布式处理模型,是分布式计算模型的一种实现,hadoop对海量文件数据比较适合,但对于很多公司的应用系统而言,基本都是基于数据库的,并没有多少文件数据需要实时分析,就是日志文件,也可以放在数据库中,特别是用户操作日志(不是系统级日志),当然,就是存成文件,格式和内容也基本是确定的,分析的时候并不需要分拆和Map.其实只要一个简单的分布式分析(reduce)即可。因此模型上没必要搞得像hadoop那么复杂(虽然说hadoop原理和实现也不是很复杂).何况大部分应用系统需要分析的数据还达不到这个级别.考虑到一般的公司应用的实时数据存放都是确定的,也就是分析数据的来源基本是确定. 阅读全文

分布式流水作业系统项目经理挂掉的处理办法(Hadoop模拟思考系列)

2012-01-21 12:13 by java线程例子, 221 阅读, 收藏,
摘要: 在前一篇中的流水作业系统中,劳动者挂掉后,由项目经理来负责处理(重新分配该子任务),这个影响相对比较小,但项目经理挂掉后,整个任务都要重新开始,就有点浪费了,这里我们采用土八路打仗的方式,让每个成员都知道打仗的目的和自己的任务(包括整体任务号,子任务号,项目经理是谁,自己负责处理的加工原料在那里,交互的产品放哪里等)同时这些成员在完成任务后,除了给项目经理报告结果之外,并不立即进行清场,而是要接到项目经理的指令后才清场,对于没有清场的任务,成员有义务每间隔一段时间发一个项目经理还活着没有的询问,如果多次询问,无结果的情况下,可以向Master报告,由Master暂时担当项目经理角色,这有4种情 阅读全文

关于分布式流水作业架构的一点浅见(领导者压力和瓶颈的解决方法和思路)

2012-01-21 10:31 by java线程例子, 216 阅读, 收藏,
摘要: 这段时间其实一直在思考Hadoop的东西,主要是我准备用Dotnet来模拟玩一下,这两天刚好看到 http://blog.csdn.net/cenwenchu79/article/details/7206804这篇文章,看来对hadoop的架构有看法的不止我一个,当然,别人都是牛人,有牛人敢怀疑,我也跟着说点看法。首先,坦率的讲,我没有用过hadoop,我只是了解过其机制,根据上面那位牛人的看法,hadoop的master会成为瓶颈,因为其担当的Reducer职责,就是最后归并结果。因为我没有实际用过hadoop,我没有发现这个问题,只是我在准备模拟hadoop的思考过程中,我觉得maste. 阅读全文

一个简单的跨域跨数据库事务处理架构

2012-01-16 22:47 by java线程例子, 2919 阅读, 收藏,
摘要: 原来只是有点这个想法,怎么去做这个事务,这次给公司做新架构演示,随带就加进去了,居然还成了,还像那么回事:我的做法很简单:自己写了个事务处理类,提供一个静态的启动事务方法,然后就是Commit,Rollback方法,再利用GUID作为事务ID。有事务处理类管理本地数据库链接和远程跨域服务信息,利用这些信息在Commit或者rollback时进行提交或者回滚,在数据库级上并行执行命令,需要对远程跨域提交或者回滚的,结合一个远程事务池、远程事务服务类和远程事务服务调用代理类(就提交和回滚两个方法)进行处理,其中用事务ID贯穿始终。当然,所有的数据访问层,数据库访问层都来由一个事务类参数,没有事务的 阅读全文

哈弗曼编码算法(简单链表法)

2011-12-26 23:24 by java线程例子, 219 阅读, 收藏,
摘要: 算法代码如下:public class HuffmanNode { public char Char { get; set; } public int Frequency { get; set; } //用于构造哈弗曼树 internal HuffmanNode LeftChild { get; set; } internal HuffmanNode RightChild { get; set; } //用于构造链表 internal HuffmanNode NextSibl... 阅读全文

剖析云计算技术及架构(计算)

2011-12-17 22:06 by java线程例子, 259 阅读, 收藏,
摘要: 我们知道要实现计算系统中计算部分的能力的提升,无外乎就两种办法,一是提高单台计算设备的能力,二是增加计算设备。我们知道,单台设备计算能力的提升总是有限度的,因此要实现云计算中计算能力的提升,增加设备就是唯一的选择。增加设备能够提升计算能力和一个应用能否利用这种增加的计算能力是两回事,而要能利用这种增加设备而带来的计算能力就需要应用支持分布式计算。因此,要达到云计算的计算能力随需应变的能力,有两个很基础的条件,一是计算机虚拟化,二是应用的分布式计算支持。因为在云计算下,不再具有物理的边界条件,用户所面对的计算机也仅仅是逻辑上的计算机,即虚拟计算机,这一点在IaaS和PaaS上非常重要。因为很多时 阅读全文

剖析云计算技术及架构(1)

2011-12-08 14:23 by java线程例子, 254 阅读, 收藏,
摘要: 我希望能有这样一台计算机:运算能力可大可小,存储空间也可大可小,我需要多少就配多少,只需要通过参数配置就达到计算机系统的升级和降级。其实云计算就是要提供给每个网络用户这样的一种逻辑上的计算机。我前面的博文已经讲了云计算的一些概念和我的理解,其实我觉得要把握为什么会有云计算,只要把握住两个地方,一是资本的逐利性,二是充分资源共享。资本的逐利性是云计算的根本动力,降低成本,提高效率,实现利润最大化是其根本目标,而资源充分共享是云计算的达到这个目标的根本手段,这是由资源的最根本特性--稀缺性决定的,如果某个资源是非常充足,比如空气,除非用特殊手段控制或者武力逼迫人们去购买,否则是没有人愿意去花钱的, 阅读全文

算法笔记(问题分解,分治与动态规划)

2011-11-27 21:45 by java线程例子, 292 阅读, 收藏,
摘要: 问题分解就是通过对问题进行分解,从而将问题分解成有限个问题规模更小的子问题,从而达到问题求解的过程或者方法。问题分解是一种从问题规模出发来进行问题求解的方法,一般来讲,问题的规模与问题的复杂性密切相关,通过降低问题的规模可以达到减低问题复杂性,从而易于问题的求解。分治策略和动态规划都是这种思想。其实问题分解是问题求解思维中的一种基本的思维方式。当然问题能通过分解来获得答案,最关键的地方就是原问题的答案与分解后的子问题之间存在着关联关系,也就是原问题的解可以通过对分解后的子问题的解经过简单运算或选择就可得到(分治策略中是合并),这是问题能否通过分解进行求解的关键所在。,当然,如果原问题能够从子问 阅读全文

算法笔记(红黑树)

2011-11-26 16:05 by java线程例子, 212 阅读, 收藏,
摘要: 前面的博文分析了一般查找树的性质,理论上来讲,可以构造m阶完全树,但这种结构,会导致调整过于频繁,所以保持相对平衡就成了一种策略。红黑树,B树都是这种考虑。分析这些树(红黑树,AVL,B树)等,一个重要的地方就是我们所做的大部分工作的目标就是需要保持树在一定程度上的平衡。下面是红黑树常见操作的实现:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace AlbertAlgorithms{ /// <summary> /// 节点颜色枚举 /// </ 阅读全文

算法笔记(有根树遍历)

2011-11-18 09:40 by java线程例子, 242 阅读, 收藏,
摘要: public class TreeNode { public string Key { get; set; } public object Data { get; set; } public TreeNode Parent; public List<TreeNode> Children { get; set; } public TreeNode(string Key,object Data) { Children = new List<TreeNode>(); ... 阅读全文

算法笔记(选择算法)

2011-11-17 20:36 by java线程例子, 226 阅读, 收藏,
摘要: 包括,选择最大值,最小值,选择第k大元素的算法。其中选择第k大元素包括随机选择算法和最坏线性时间算法。选择算法有一个假设就是输入的元素都不相同,如果是输入序列有重复的,那么这些算法都不适用。由于输入序列条件苛刻,因此实际应用中感觉很难用,还不如老老实实先排序,然后再遍历寻找。下面是算法实现代码:public class MySearchs { /// <summary> /// 获取最大值和最小值. /// </summary> /// <param name="A"></param> /// <param name.. 阅读全文

算法笔记(堆实现的最大优先队列)

2011-11-17 20:20 by java线程例子, 325 阅读, 收藏,
摘要: 采用最大堆实现的优先队列,QueueElement是队列元素类,包含一个卫星数据成员和一个权重Key值: public class QueueElement<T> { public int KeyValue{get;internal set;} public T Element{get;private set;} public QueueElement(T Item,int KeyVal) { KeyValue = KeyVal; Element = Item; ... 阅读全文