摘要:
什么让你对C/C++如此恐惧?本篇将继续上一篇来讨论段错误(Segmentation fault)。 上一篇: 你的C/C++程序为什么无法运行?揭秘Segmentation fault(1)追溯段错误如果你觉得你已经理解了段错误的根源,也知道了如何防止段错误,那么可以到此为止。否则... 阅读全文
摘要:
本文试图通过几幅简明的图来介绍遗传算法。背景当一些问题不存在确定性的最优解法,或者说最优解法的施展时间长的1-B,那我们就得开始考虑点其他路子了。比如说旅行商问题:旅行商要去很多城市卖货,为了节省时间,它一个城市只去一次,最后还得返回原城市,因为他老婆不允许他离开太久。 它怎么走比较合算?城市的... 阅读全文
摘要:
在讨论我们是否真的需要Map-Reduce这一分布式计算技术之前,我们先面对一个问题,这可以为我们讨论这个问题提供一个直观的背景。问题我们先从最直接和直观的方式出发,来尝试解决这个问题: 先伪一下这个问题:SELECT COUNT(DISTINCT surname) FROM big_name_fi... 阅读全文
摘要:
接上一部分:搜索引擎-架构概述(1)查询处理系统查询处理系统主要包含三个构件:用户交互、排序和评价。 用户交互组件 (User interaction)创建查询、完善查询以及向用户展示结果. 比如,将用户的查询转换为索引项. 并将从搜索引擎得到的有序文档列表组织成搜索结果,展示给用户... 阅读全文
摘要:
架构对软件系统来讲,从一个层面对系统的各个组件进行抽象.描述它们各自的功能、提供的接口以及它们之间的关系.需求架构为应付需求而产生,对搜索引擎来讲,它主要的需求来自两个方面: 效果(effectiveness):搜索的结果质量如何. 效率(effeciency):返回结果的相应... 阅读全文
摘要:
Dijkstra’s algorithm迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之和为最小的路径.迪杰斯特拉算法不能处理权值为负数或为零的边,因为本质上它是一种贪心算... 阅读全文
摘要:
算法描述在普利姆算法的lazy实现中,参考:普利姆算法的lazy实现 我们现在来考虑这样一个问题: 我们将所有的边都加入了优先队列,但事实上,我们真的需要所有的边吗?我们再回到普利姆算法的lazy实现,看一下这个问题: 当顺着顶点0的邻接表考察顶点7时,边7-2和边7-1被加入了... 阅读全文
摘要:
算法描述lazy普利姆算法的步骤: 1.从源点s出发,遍历它的邻接表s.Adj,将所有邻接的边(crossing edges)加入优先队列Q; 2.从Q出队最轻边,将此边加入MST. 3.考察此边的两个端点,对两个端点重复第1步.示例从顶点0开始,遍历它的邻接表:边0-7、... 阅读全文
摘要:
算法描述克鲁斯卡尔算法是一种贪心算法,因为它每一步都挑选当前最轻的边而并不知道全局路径的情况. 算法最关键的一个步骤是要判断要加入mst的顶点是否会形成回路,我们可以利用并查集的技术来做。并查集的具体实现可参考:快速并查集下面是对算法的一个简单描述: 这是一个非常简单易懂的算法,它面... 阅读全文
摘要:
为了达到O(ElogV)的效率,需要对普利姆算法进行eager实现。 如果我们用java来做,jdk当中的priorityQueue并不能满足我们的要求。 因为我们需要进行一个对索引元素降key的操作(decrease-key)./** * 将索引所关联的key降到newKe... 阅读全文
摘要:
minimum spanning tree(MST)最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点、无环、路径的权重和为所有路径中最小的.graph-cut对图的一个切割或者叫切断,会使图分离成为两个不相连的顶点集. 它基于树的两个基本属性: 为树的任意两个节... 阅读全文
摘要:
背景最小生成树(Minimum Spanning Tree)的算法中,克鲁斯卡尔算法(Kruskal‘s algorithm)是一种常用算法.在克鲁斯卡尔算法中的一个关键问题是如何判断图中的两个点是否形成环(cycle),那么一种高效的判断方式就是使用并查集技术(Union-Find).代码/** ... 阅读全文