
编程-算法
文章平均质量分 79
lyso1
北京大学计算机系学士、硕士, 在校期间发表关于GPU并行计算的国际顶级会议论文,曾就职于网易有道、小米科技,负责网易八方、网易饭饭、米推、米聊、米云等大型移动互联网服务相关的设计及研发工作,并主导完成多种相关基础架构的设计及开发,应用于亿级日活的产品服务集群中,有着丰富的高并发分布式系统架构经验。
展开
-
《编程之美》 2.18 数组分割 zz
<br /> <br />题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。<br />假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:<br />S(k, 1) = {A[i] | 1<= i <= k}<br />S(k, k) = {A[1]+A[2]+…+A[k]}<br />S(k, i) = S(k-1, i) U {A[k]转载 2010-10-11 16:12:00 · 1085 阅读 · 0 评论 -
后缀树和后缀数组 zz
<br />http://imlazy.ycool.com/post.2011818.html 后缀树和后缀数组简直就是 ACM 选手必备的知识啊,我已经在两次比赛中碰到过相关的问题了。我甚至还写过一篇应用的文章,可是我真是井底之蛙啊,那时我还不知道这个叫后缀数组,还有更好的构造算法,还有很多的应用。最近终于好好在这方面扫了个盲,在此小小地总结一下。<br /><br /> 假设有一个长度为 n 的字符串 T[0 ... n);S(i) 表示 T 的从下标 i 开始的后缀,即 T[i ...转载 2010-09-12 15:26:00 · 744 阅读 · 0 评论 -
寻找最大的K个数 zz
<br />http://www.liaoqiqi.com/2010/09/03/%E5%AF%BB%E6%89%BE%E6%9C%80%E5%A4%A7%E7%9A%84k%E4%B8%AA%E6%95%B0/<br /> <br /><br />这是编程之美书第2.5节的一道题目。各种解法:<br />解法一,用nlgn复杂度的排序算法对数组进行从大到小排序,取前K个。但这方法做了两件不必要做的事:它对想得到的K个数进行了排序,对不想得到的n-K个数也进行了排序。方法不可取。<br />解法二,用选择排转载 2010-09-12 13:44:00 · 734 阅读 · 0 评论 -
MapReduce zz
MapReduce: 一个巨大的倒退http://www.pgsqldb.org/mwiki/index.php/MapReduce:_%E4%B8%80%E4%B8%AA%E5%B7%A8%E5%A4%A7%E7%9A%84%E5%80%92%E9%80%80版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://dreamhead.blogbus.com/logs/2617482.htmlMapReduce是Google的一项重要技术,它是一个编程模型,用以进行大数据量的计算。对于转载 2010-09-12 21:33:00 · 314 阅读 · 0 评论 -
Bloom Filter的几个小技巧
<br />http://hi.baidu.com/airzhutao/blog/item/8883b4d0f308e383a0ec9cd9.html<br />原文地址:http://hi.baidu.com/xdzhang_china/blog/item/2847777e83fb020229388a15.html<br />下 面列举几个基于标准Bloom Filter的 小技巧:<br /> <br />1. 求两个集合的并。假设有两个Bloom Filter分别表示集合S1和S2,它转载 2010-09-12 20:42:00 · 320 阅读 · 0 评论 -
大数据量,海量数据 处理方法总结 zz
<br /> http://duanple.blog.163.com/blog/static/7097176720091026458369/<br />大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。<br /><br />下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一转载 2010-09-12 20:18:00 · 357 阅读 · 0 评论 -
MapReduce和并行数据库,朋友还是敌人? zz
<br />http://www.programmer.com.cn/4014/<br /> <br />文/何伟平<br /><br /><br /> <br />在2010年1月的ACM上,有两篇文章非常吸引人注意。一篇文章是Google的Jeffrey Dean、Sanjay Ghemawat发表的标题为《MapReduce:一个灵活的数据库处理工具》,另一篇文章是Michael Stonebraker、Daniel Abadi、David J. DeWitt、Sam Madden、Erik Pau转载 2010-09-12 21:31:00 · 357 阅读 · 0 评论 -
最短路径算法-Floyd zz
floyd算法用以解决所有点对最短路径。floyd算法基本思想是递推,动态规划。我们记 dp[i][j][k] 表示图中顶点 i 到 j 的最短路径,且该最短路径中,所经过的中间顶点(不包括 i, j) 的范围为 [1,k],由此我们可以得到以下递推式:dp[i][j][k]= w[i][j] 如果 k== 0dp[i][j][k]= min{ dp[i][k][k-1]+ dp[k][j][k-1] } 如果 k>= 1。实际中,空间上我们可以减少一维。floyd算法同样可以来解决一些其它问题1)转载 2010-06-22 16:21:00 · 680 阅读 · 0 评论 -
最短路径问题 Floyd SPFA Dijkstra 效率实战大比拼 zz
虽然时间复杂度都清楚,不过实际运行起来如何心里还是没底,实践才是检验真理的标准啊 前面在USACO 3.2.6 Sweet Butter 那道题中已经看到,稀疏图中对单源问题来说 SPFA 的效率略高于 Heap+Dijkstra ;对于无向图上的 APSP (All Pairs Shortest Paths)问题,SPFA算法加上优化后效率更是远高于 Heap+Dijkstra。今次再来看一看稠密图上的实验结果。 (注:以下提到的Dijkstra,如无特别说明,均指加入二叉堆(Binary-Heap)优化转载 2010-06-22 17:58:00 · 643 阅读 · 0 评论 -
字符串问题实例 zz
<br /><br />http://duanple.blog.163.com/blog/static/70971767200982584340501/<br /> <br />1.求最长回文子串。<br />[解法]:<br />将整个字 符串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为了<br />求这个新的字符串的某两个后缀的最长公共前缀。而某两个后缀的lcs的计算利用后缀数组,可以O(1),这样总的复杂度就可以降为O(n)。<br />eg:aabebf ---->转载 2010-09-12 16:20:00 · 407 阅读 · 0 评论 -
Bloom Filter概念和原理 zz
http://blog.csdn.net/jiaomeng/archive/2007/01/27/1495500.aspxBloom Filter概念和原理焦萌 2007年1月27日Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那转载 2010-09-12 20:29:00 · 285 阅读 · 0 评论 -
排列组合与回溯算法 zz
排列组合与回溯算法排列组合与回溯算法KuiBing感谢Bamboo、LeeMaRS的帮助[关键字] 递归 DFS[前言] 这篇论文主要针对排列组合对回溯算法展开讨论,在每一个讨论之后,还有相关的推荐题。在开始之前,我们先应该看一下回溯算法的概念,所谓回溯:就是搜索一棵状态树的过程,这个过程类似于图的深度优先搜索(DFS),在搜索的每一步(这里的每一步对应搜索树的第i层)中产生一个正确的解,然后在以后的每一步搜索过程中,都检查其前一步的记录,并且它将有条件的选择以后的每一个转载 2010-09-16 22:03:00 · 1220 阅读 · 0 评论 -
回溯法之一---算法框架及基础 zz
回溯法之一---算法框架及基础回溯法其实也是一种搜索算法,它可以方便的搜索解空间。 回溯法解题通常可以从以下三步入手: 1、针对问题,定义解空间 2、确定易于搜索的解空间结构 3、以深度优先的方式搜索解空间,并在搜索的过程中进行剪枝 回溯法通常在解空间树上进行搜索,而解空间树通常有子集树和排列树。 针对这两个问题,算法的框架基本如下: 用回溯法搜索子集合树的一般框架:Cpp代码 void backtrack(int t){ if(t > n) output(x); else{转载 2010-09-16 17:45:00 · 565 阅读 · 0 评论 -
字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
<br /> http://duanple.blog.163.com/blog/static/709717672009825004092/<br />涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用。当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟悉的大概是kmp,即使如此还是有相当一部分人也不理解kmp,更别说其他的了。当然一般的字符串问题中,我们只要用简单的暴力算法就可以解决了,然后如果暴力效率太转载 2010-09-16 15:45:00 · 562 阅读 · 0 评论 -
尾递归与Continuation zz
<br />http://blog.201314.info/2010/05/24/%E5%B0%BE%E9%80%92%E5%BD%92%E4%B8%8Econtinuation.html <br />尾递归与Continuation2010年5月24日评论发表评论<br />关于递归操作,相信大家都已经不陌生。简单地说,一个函数直接或间接地调用自身,是为直接或间接递归。例如,我们可以使用递归来计算一个单向链表的 长度:public class Node{ public Node(int va转载 2010-09-16 15:09:00 · 243 阅读 · 0 评论 -
并查集学习笔记 zz
<br /><br />PS:从今天开始开始认真的按顺序把ACM程序设计竞赛的算法系统的学习一下,并做好的笔记整理,好多可能援引其他人的课件或者博客,我会写出出处的,当然大部分是我自己的原创的,希望各位看官大牛们指教;<br />言归正传,并查集。<br />并查集维基百科中是这样描述的:并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。我看到有资料上有写可以用数组实现,可以用链表实现,看得我糊里糊涂的,感觉用树的结构来写实现起来转载 2010-09-14 15:23:00 · 385 阅读 · 0 评论 -
并查集小结 zz
<br />http://bchine.com/mjmjmtl/?p=306<br />并查集大体分为三个:普通的并查集,带种类的并查集,扩展的并查集(主要是必须指定合并时的父子关系,或者统计一些数据,比如此集合内的元素数目。)<br /><br />POJ-1182<br />经典的种类并查集<br />POJ-1308<br />用并查集来判断一棵树。。注意空树也是树,死人也是人。<br />POJ-1611<br />裸地水并查集<br />POJ-1703<br />种类并查集<br />POJ-1转载 2010-09-14 15:18:00 · 1795 阅读 · 1 评论 -
一道概率题 zz
<br />http://hi.baidu.com/maxint/blog/item/15e57f164047b05ff2de32af.html <br />题目两个人甲和乙竞选,统计结果是甲p票,乙q票(p>q)。问在计票过程中甲的得票数始终大于乙的得票数的概率是多少?(由原校内数学系bbs的ZXY同学分享)两个回帖<br />第一个没看明白,先记录着,第二个解答比较巧妙易懂,第三个是网友google到的ZXY:结果是(p-q)/(p+q)<br />由这道题可以引申出一个比较深刻的问题,具体我也转载 2010-09-14 14:06:00 · 650 阅读 · 0 评论 -
《编程之美》之概率题:金刚坐飞机问题
<br />http://hi.baidu.com/maxint/blog/item/8ac3c49707911f6354fb96e9.html<br />问题<br />现在有一班飞机将要起飞,乘客们正准备按机票号码(1, 2, 3, …N)依次排队登机。突然来了一只大猩猩(对,他叫金刚)。他也有飞机票,但是他插队第一个登上了飞机,然后随意地选了一个座位坐下了。根据社会的和谐程度,其他的乘客有两种反应:乘客们都义愤填膺,“既然金刚同志不遵守规定,为什么我要遵守?”他们也随意地找位置坐下,并且坚决不让座转载 2010-09-14 13:14:00 · 517 阅读 · 0 评论 -
最短路径算法-Dijkstra zz
Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达顶点的最短路径问题。 设G=(V,E)是一个有向图,V表示顶点,E表示边。它的每一条边(i,j)属于E,都有一个非负权W(I,j),在G中指定一个结点v0,要求把从v0到G的每一个接vj(vj属于V)的最短有向路径找出来(或者指出不存在)。 Dijstra算法是运用贪心的策略,从源点开始,不断地通过相联通的点找出到其他点的最短距离基本思想是: 设置一个顶点的集合s,并不断地扩转载 2010-06-22 16:41:00 · 346 阅读 · 0 评论 -
最大团问题 zz
这是一个很典型的NP问题.很长一段时间一直在想如何解决它,直到那天看了一位前人推荐的文档,得到一些启发才顺利的解决了这个困扰我多天的问题.典型描述:给定一个图G,要求G的最大团(团是指G的一个完全子图,该子图不包含在任何其他的完全子图当中。最大团指其中包含顶点最多的团).该命题可以有很多变种,例如1002,1654的放机器人,实质上都是求最大团的问题,当然,由于问题的特殊性,他们或许还可以用其他更高效的算法来解.毕竟,问题抽象,解法一般后其实现难度和复杂度也会增大.解决该问题的一般算法该是搜索.设其包含顶点转载 2010-06-16 22:10:00 · 792 阅读 · 0 评论 -
排序小结——7.各种内部排序方法的比较
按平均时间将排序分为四类:(1)平方阶(O(n2))排序 一般称为简单排序,例如直接插入、直接选择和冒泡排序;(2)线性对数阶(O(nlgn))排序 如快速、堆和归并排序;(3)O(n1+£)阶排序 £是介于0和1之间的常数,即0(4)线性阶(O(n))排序 如桶、箱和基数排序。各种排序方法比较 简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入原创 2010-04-30 09:59:00 · 220 阅读 · 0 评论 -
排序小结——4.选择排序
选择排序 选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。 常用的选择排序方法有直接选择排序和堆排序。直接选择排序(Straight Selection Sort)1、直接选择排序的基本思想 n个记录的文件的直接选择排序可经过n-1趟直接选择原创 2010-04-30 09:46:00 · 390 阅读 · 0 评论 -
排序小结——2.插入排序
插入排序插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。 本节介绍两种插入排序方法:直接插入排序和希尔排序。 直接插入排序基本思想1、基本思想 假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起原创 2010-04-30 09:24:00 · 244 阅读 · 0 评论 -
排序小结——1. 排序的基本概念
from http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.1.1.1.htm 排序(sort)或分类 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下: 输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn。 输出:Ril,Ri2转载 2010-04-30 09:17:00 · 210 阅读 · 0 评论 -
排序小结——6.分配排序
分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O(n)。箱排序(Bin Sort)1、箱排序的基本思想 箱排序也称桶排序(Bucket Sort),其基本思想是:设置若干个箱子,依次扫描待排序的记录R[0],R[1],…,R[n-1],把关键字等于k的记录全都装入到第k个箱子里(分配),然后按序号依次将各非空的箱子首尾连原创 2010-04-30 09:58:00 · 215 阅读 · 0 评论 -
排序小结——5.归并排序
void MergeSort(SeqList R) {//采用自底向上的方法,对R[1..n]进行二路归并排序 int length; for(1ength=1;length<n;length*=2) //做 趟归并 MergePass(R,length); //有序段长度≥n时终止 } 归并排序(Merge Sort)原创 2010-04-30 09:54:00 · 244 阅读 · 0 评论 -
排序小结——3.交换排序
交换排序 交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。冒泡排序1、排序方法 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反原创 2010-04-30 09:30:00 · 298 阅读 · 0 评论 -
A*搜索算法
<br /><br />搜索方法小结 2006/09/11 rickone<br />不管哪种搜索,都统一用这样的形式表示:搜索的对象是一个图,它面向一个问题,不一定有明确的存储形式,但它里面的一个结点都有可能是一个解(可行解),搜索的目的有两个方面,或者求可行解,或者从可行解集中求最优解,我们用两张表来进行搜索,一个叫OPEN表,表示那些已经展开但还没有访问的结点集,另一个叫CLOSE表,表示那些已经访问的结点集。<br />一、蛮力搜索(DFS,BFS)<br />DFS和BFS是最基本的搜索算法,用上转载 2010-06-28 13:37:00 · 1540 阅读 · 0 评论 -
整数的质因数分解
void f(int num){ bool flag; for (int i = int(sqrt((double)num));i>1;i--) { if((num%i)==0) flag= false; } if(!flag) { for (int i = int(sqrt(num));i>1;i--) { if((num%i)==0) {转载 2010-06-28 11:47:00 · 329 阅读 · 0 评论 -
芯片测试问题 zz
题目:(30分)芯片测试:有2k块芯片,已知好芯片比坏芯片多.请设计算法从其中找出一片好芯片,说明你所用的比较次数上限.其中:好芯片和其它芯片比较时,能正确给出另一块芯片是好还是坏.坏芯片和其它芯片比较时,会随机的给出好或是坏。题目分析:不妨设用芯片比较时,0表示好的判断,1表示坏的判断,X表示不确定的判断。两个芯片进行比较时,可能出现三种情况: a) 两个都好 ==> (0,0)转载 2010-05-07 18:25:00 · 447 阅读 · 0 评论 -
各种字符串Hash函数比较
<br />常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用<br />位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,<br />这些函数几乎不可能找到碰撞。<br />常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,<br />PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。 <br /> Hash函数数据1数转载 2010-08-02 12:58:00 · 196 阅读 · 0 评论 -
打造最快的Hash表 zz
<br />先提一个简单的问题,如果有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做?<br /><br />有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能工作,但...也只能如此了。<br /><br />最合适的算法自然是使用HashTable(哈希表),先介绍介绍其中的基本知识,所谓Hash,一般是一个整数,转载 2010-08-02 14:30:00 · 208 阅读 · 0 评论 -
字符串hash算法比较 AND 经典HASH函数zz
字符串的算法一般大公司都会考到,我们首先要想到高效的hash。如百度查找一组字符串是否出现在某个文本中,这个不是考什么kmp,他们想听到的是hash。趋势科技考的是从某个文本中删除一组字符串,我想也是要hash吧。<br /><br /><br />1 概述链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的转载 2010-08-02 12:59:00 · 239 阅读 · 0 评论 -
trie树、B树、B-树、B+树、B*树 zz
<br />红黑树rbtree 二叉排序树<br />map 就是采用红黑树存储的,红黑树(RB Tree)是平衡二叉树,其优点就是树到叶子节点深度一致,查找的效率也就一样,为logN.在实行查找,插入,删除的效率都一致,而当是全部静态数据时,没有太多优势,可能采用hash表各合适。<br />hash_map是一个hash table占用内存更多,查找效率高一些,但是hash的时间比较费时。<br />总 体来说,hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别;而转载 2010-07-25 10:39:00 · 332 阅读 · 0 评论 -
平衡二叉树( AVL树 ) (zz)
平衡二叉树( AVL树 ):二叉排序树的查找与树的形态密切相关,当树的形态比较均衡时查找效率最高,当树的形态偏向于某一个方向是效率迅速降低,而一颗二叉树的形态取决于数据插入的先后顺序,如果构造一颗较均衡的二叉树比较困难。那有没有合适的方法把一颗不平衡的树调整为平衡的二叉树,答案是肯定的。这就是平衡二叉树在1962年由Adelson-Velskii和Landis提出的,所以又叫AVL树。转载 2010-05-27 13:05:00 · 893 阅读 · 0 评论 -
多线程编程小记
1. CreateThread创建线程;2. 在主线程里用PostThreadMessage(threadID, MSG_, wParam, lParam)给创建的线程传递消息。 注意:传递消息之前最好用Sleep(1)一下,否则可能会接收不到消息。 HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTIN原创 2010-05-10 20:10:00 · 215 阅读 · 0 评论 -
海量数据搜索、存储、查询、排序算法
百度、google海量数据搜索算法题解 海量数据库的应用,如国家的人口管理系统,户籍档案管理系统,在这样的海量数据库应用中,数据库的存储设计和结构优化(如索引优化)、数据库的查询优化及分页算法尤为重要! 随着互联网的日益普及,海量信息的增长,网格运算的到来,海量数据存储产品和海量数据存储技术方案的需求更为市场所需。 同时,实际的海量数据处理,更是涉及很多细节,包括海量数据存转载 2010-05-10 10:16:00 · 1643 阅读 · 0 评论 -
10G个数找中位数
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。 位图法assert(sizeof(int) ==4);int 能表示的最大数是2^32,如果每位代表一个数,表示最大的整数需要(2^32)/8 =2^28个字节的内存。这样2G内存足够用。1.刚开始定义一个 unsigned char ar[2^28]这样的数组。2.memset全部清O。3.按顺转载 2010-05-10 09:37:00 · 2254 阅读 · 0 评论 -
最小生成树-prim & kruskal
对于连通的带权图(连通网)G,其生成树也是带权的。生成树T各边的权值总和称为该树的权,记作:这里:TE表示T的边集w(u,v)表示边(u,v)的权。权最小的生成树称为G的最小生成树(Minimum SpannirngTree)。最小生成树可简记为MST。一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图联通的最少的边。 许多应用问题都是一个球五项连通图的最小生成树问题。例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间转载 2010-06-28 11:14:00 · 849 阅读 · 0 评论