
算法
文章平均质量分 76
长空飞鹰
互联网IT技术族
展开
-
常用算法设计方法
要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。算法数据结构是程序的两个重要方面。 算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。指令正确地描述了要完成的转载 2008-12-04 20:43:00 · 660 阅读 · 0 评论 -
追MM和各种算法详解
动态规划,基本上就是说:你追一个MM的时候,需要对该MM身边的各闺中密友都好,这样你追MM这个问题就分解为对其MM朋友的问题,只有把这些问题都解决了,最终你才能追到MM。因此,该问题适用于聪明的MM,懂得“看一个人,不是看他如何对你,而是看他如何对他人。”的道理,并且对付这样的MM总能得到最优解。但确定是开销较大,因为每个子问题都要好好对待。。。。 贪心法,基本上就是:你追转载 2008-12-04 20:45:00 · 712 阅读 · 0 评论 -
排序算法
稳定的排序:排序前后的相对顺序不改变:排序前若Ri排在Rj之前,排序之后仍然是这样。不稳定的排序:与稳定相反。内部排序:待排序数据存放于计算机随即存储器之中。外部排序:待排序数据存放于外存中。参考书目:数据结构C语言版,严蔚敏,吴伟民定义数据结构:#define MAXSIZE 20typedef int KeyType;typedef struct{转载 2008-12-04 20:46:00 · 469 阅读 · 0 评论 -
算法时间复杂度分析基础
摘要 本文论述了在算法分析领域一个重要问题——时间复杂度分析的基础内容。本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导。从而帮助大家从本质上认清这个概念。前言 通常,对于一个给定的算法,我们要做两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确转载 2008-12-06 12:59:00 · 932 阅读 · 0 评论 -
数据结构——杂凑表(拉链法)
拉链法转载 2010-08-12 22:00:00 · 2882 阅读 · 0 评论 -
网页去重算法simhash 简析
在工作学习中,我往往感叹数学奇迹般的解决一些貌似不可能完成的任务,并且十分希望将这种喜悦分享给大家,就好比说:“老婆,出来看上帝”……随着信息爆炸时代的来临,互联网上充斥着着大量的近重复信息,有效地识别它们是一个很有意义的课题。例如,对于搜索引擎的爬虫系统来说,收录重复的网页是毫无意义的,只会造成存储和计算资源的浪费;同时,展示重复的信息对于用户来说也并不是最好的体验。造成网页近重复的可能转载 2011-11-23 11:56:43 · 1368 阅读 · 0 评论 -
各种字符串Hash函数比较
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函转载 2011-11-23 12:10:29 · 943 阅读 · 0 评论 -
散列表-开放地址法
散列表的查找过程和建表过程相似。假设给定的值为K,根据建表时设定的散列函数h,计算出散列地址h(K),若表中该地址单元为空,则查找失败;否则将该地址中的结点与给定值K比较。若相等则查找成功,否则按建表时设定的处理冲突的方法找下一个地址。如此反复下去,直到某个地址单元为空(查找失败)或者关键字比较相等(查找成功)为止。(1)开放地址法一般形式的函数表示 int Hash(KeyType转载 2010-08-12 22:14:00 · 1540 阅读 · 0 评论 -
约瑟夫问题
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:本题就是有名的约瑟夫环问题。既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。转载 2011-11-25 11:22:29 · 584 阅读 · 0 评论 -
几个随机算法
在日常工作中,经常需要使用随机算法。比如面对大量的数据, 需要从其中随机选取一些数据来做分析。 又如在得到某个分数后, 为了增加随机性, 需要在该分数的基础上, 添加一个扰动, 并使该扰动服从特定的概率分布。本文主要从这两个方面出发, 介绍一些算法, 供大家参考。首先假设我们有一个使用的随机函数float frand(), 返回值在(0, 1)上均匀分布。大多数的程序语言库提供这样的函数。转载 2012-05-14 12:43:06 · 930 阅读 · 0 评论 -
栈的push、pop 序列
题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1 就有可能是一个pop 系列。因为可以有如下的push 和pop 序列:push 1,push 2,push3,push 4,pop,push转载 2014-06-04 10:48:16 · 1306 阅读 · 0 评论 -
一致性 hash 算法
consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在cache 系统中应用越来越广泛;1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的转载 2014-06-04 10:53:57 · 725 阅读 · 0 评论 -
匈牙利算法
这是一种用增广路求二分图最大匹配的算法。它由匈牙利数学家Edmonds于1965年提出,因而得名。 定义 未盖点:设Vi是图G的一个顶点,如果Vi 不与任意一条属于匹配M的边相关联,就称Vi 是一个未盖点。交错路:设P是图G的一条路,如果P的任意两条相邻的边一定是一条属于M而另一条不属于M,就称P是一条交错路。 可增广路:两个端点都是未盖点的交错路叫做可增广转载 2012-05-11 16:45:02 · 563 阅读 · 0 评论 -
文本去重之MinHash算法
1.概述 跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度。MinHash由Andrei Broder提出,最初用于在搜索引擎中检测重复网页。它也可以应用于大规模聚类问题。2.Jaccard index 在介绍MinHash之前,我们先介绍下Jaccard index。 Jaccard转载 2016-03-03 14:46:10 · 676 阅读 · 0 评论 -
Mergesort-归并排序
#include using namespace std; void Merge(intr[],int r1[],int s,int m,int t){inti=s;intj=m+1;intk=s;while(iif(r[i]elser1[k++]=r[j++];}if(iwhile(ielsewhile(jfor(intl=s;转载 2014-06-04 10:37:21 · 872 阅读 · 0 评论 -
排序方法比较
根据排序的原则,内排序可以分为:插入排序交换排序选择排序归并排序预备知识:1.等差数列之和:S=n*(a1+an)/2等比数列之和:S=a1(1-q^n)/(1-q)2.使用哨兵提高效率比如基本的顺序查找我们可以这样做: int search(int a[],int n,int key){ for(int i=0;i转载 2012-08-29 19:18:59 · 687 阅读 · 0 评论 -
Hacker News与Reddit的算法比较
郑昀 20101213Hacker News是Y Combinator旗下的一个新闻频道,属于digg类产品,SEOmoz曾经在2008年7月隆重推出Reddit、Stumbleupon、Del.icio.us和Hacker News算法全揭秘。由此,这些知名Web2.0网站的算法浮出水面。谷文栋曾在2009年时如下讲述了Hacker News的Ranking算转载 2012-06-25 12:04:04 · 1011 阅读 · 0 评论 -
基于用户投票的排名算法
目录 基于用户投票的排名算法(一):Delicious和Hacker News 基于用户投票的排名算法(二):Reddit 基于用户投票的排名算法(三):Stack Overflow 基于用户投票的排名算法(四):牛顿冷却定律 基于用户投票的排名算法(五):威尔逊区间 基于用户投票的排名算法(六):贝叶斯平均 基于用户投票的排名算法(一):Deli转载 2012-06-07 19:47:41 · 1824 阅读 · 0 评论 -
Mergesort-归并排序
#include using namespace std; void Merge(intr[],int r1[],int s,int m,int t){inti=s;intj=m+1;intk=s;while(iif(r[i]elser1[k++]=r[j++];}if(iwhile(ielsewhile(jfor(intl=s;转载 2011-11-25 11:26:21 · 391 阅读 · 0 评论 -
快排求第k大数
void swap(int *c, int* d){ int e; e = *c; *c = *d; *d = e;} intpartition(int a[],int p,int r){ int x,i,j; x = a[r]; i = p - 1; for(j=p; j转载 2011-11-25 11:26:03 · 588 阅读 · 0 评论 -
归并排序
归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。 两路归并算法 1、算法基本思路 设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。转载 2011-11-25 11:23:11 · 590 阅读 · 0 评论 -
10亿个数选取重复次数最多的100个整数
有10亿个整数,要求选取重复次数最多的100个整数要解答这个问题,首先要弄清楚下面几个条件。(1)有内存限制吗?(2)整数的范围是多少?有符号,无符号,32位还是64位?(3)整数集的内容大吗?(即出现的整数空间的大小大吗?)(4)如果只需要求模糊解,怎么解?(5)求数组中的第k大元素?(6)相关问题:求一个整数列中出现次数最多的整数(7)相关问题:有一个整数数组,转载 2011-11-25 11:23:32 · 3810 阅读 · 0 评论 -
快速排序
基本思想快速排序(Quicksort)是对冒泡排序的一种改进。由C.A. R.Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 特点:不稳定最坏情况下时间复杂度O(n^2)空间开销O(转载 2011-11-25 11:23:48 · 517 阅读 · 0 评论 -
堆排序
定义n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):(1) ki≤K2i且ki≤K2i+1或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ n)若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。(即如果按照转载 2011-11-25 11:24:12 · 545 阅读 · 0 评论 -
Qsort-快排
void quicksort(int *left,int * right){ inttmp=*left;int*first=left;int*last=right;while(left!=right){while(left!=right&&tmp*left=*right;while(left!=right&&tmp>*right)left++;*right=*l转载 2011-11-25 11:25:12 · 493 阅读 · 0 评论 -
快排的非递归实现
#include#include#includeusing namespace std;vectora;void input(){ //实现数组元素的初始化 freopen("test.txt","r",stdin); intc,i,n; cin>>n; for(i=0;i { cin>>c;转载 2011-11-25 11:25:34 · 496 阅读 · 0 评论 -
大整数乘法
通常,在分析算法的计算复杂性时,都将加法和乘法运算当作基本运算来处理,即将执行一次加法或乘法运算所需的计算时间,当作一个仅取决于计算机硬件 处理速度的常数。这个假定仅在参加运算的整数能在计算机硬件对整数的表示范围内直接处理才是合理的。然而,在某些情况下,要处理很大的整数,它无法在计算 机硬件能直接表示的整数范围内进行处理。若用浮点数来表示它,则只能近似的表示它的大小,计算结果中的有效数字也受到限制转载 2013-06-18 11:56:47 · 1301 阅读 · 0 评论 -
找素数算法总结
问题描述:寻找素数 求小于自然数N的所有素数。解决方案程序 1-1 经典算法经典的素数判定算法是这样:给定一个正整数n,用2到sqrt(n)之间的所有整数去除n,如果可以整除,则n不是素数,如果不可以整除,则n就是素数。所以求小于N的所有素数程序如下: #include #include #define N 1000000 int main转载 2012-06-06 23:31:34 · 1455 阅读 · 0 评论 -
1的概率P,0的概率1-P,生成1/2 1 1/2 0的方法+1/N 1-N的方法
F(X):P(F(X)=1)=1-P;P(F(X)=0)=P;G(X):P(G(X)=0)=P(F(X)>0)=1-P;P(G(X)=1)=P(F(X) P(G(X)=0&& F(X)=0)=(1-P) * P;P(G(X)=1&& F(X)=1)=P * (1-P);P(G(X)=1&& F(X)=0)=P* P;P(G(X)=0&& F(X)=1)=(1转载 2011-11-25 11:33:11 · 2601 阅读 · 0 评论 -
未知长度链表中随机取数
如何从n个排序的对象中选择一个,但实现不知道n的大小 解答:总是选择第一个对象,并使用1/2的概率选择第二个对象,使用1/3的概率选择第三个对象,以此类推。在过程结束时,每个对像被选中的概率都是1/n转载 2011-11-25 11:32:53 · 883 阅读 · 0 评论 -
链表中随机取出k个数
题目:给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍历这个链表一次。你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现概率均等)。 解答:先选中前k个,从第k+1个元素到最后一个元素为止, 以1/i (i=k+1, k+2,...,N) 的概率选中第i个元素,并且随机替换掉一个原先选中的元素,这样遍历转载 2011-11-25 11:32:37 · 966 阅读 · 0 评论 -
把数组排成最小的数
输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。分析:这是09年6月份百度新鲜出炉的一道面试题,从这道题我们可以看出百度对应聘者在算法方面有很高的要求。这道题其实是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。要确定排序规则转载 2011-11-25 11:32:02 · 646 阅读 · 0 评论 -
在从1到n的正数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。分析:这是一道广为流传的google面试题。用最直观的方法求解并不是很难,但遗憾的是效率不是很高;而要得出一个效率较高的算法,需要比较强的分析能力,并不是件很容易的事情。当然,google的面试题中简单的也没有几道。首先我们来转载 2011-11-25 11:31:48 · 485 阅读 · 0 评论 -
寻找丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数只能被2、3转载 2011-11-25 11:31:31 · 441 阅读 · 0 评论 -
八皇后问题
题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。这就是有名的八皇后问题。解决这个问题通常需要用递归,而递归对编程能力的要求比较高。因此有不少面试官青睐这个题目,用来考察应聘者的分析复杂问题的能力以及编程的能力。由于八个皇后的任意两个不能处转载 2011-11-25 11:31:13 · 370 阅读 · 0 评论 -
数值的整数次方
题目:实现函数doublePower(double base, int exponent),求base的exponent次方。不需要考虑溢出。分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码:double Power(double base, int exponent){double result =1.0;for(int i =转载 2011-11-25 11:30:54 · 486 阅读 · 0 评论 -
输出1到最大的N位数
题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。应聘者在解决这个问题的时候,最容易想到的方法是先求出最大的n位数是什么,然后用一个循环从1开始逐个输出。很快,我们就能写出如下代码:// Print numbers from 1 to the maxi转载 2011-11-25 11:30:33 · 541 阅读 · 0 评论 -
求1+2+...+n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制转载 2011-11-25 11:30:06 · 659 阅读 · 0 评论 -
随机取数问题
问题描述:输入两个正整数m和n(m方法一:O(n)整体来说,从n个整数中随机选择m个不重复整数,选择每一个整数的概率都是m/n,因此在进行选择时,需要保证每个整数被选择的概率是m/n就能满足问题要求。实现代码如下:if(rand()%remaining 例如,从5个元素中选择2个元素,(1)在选择第一个元素时:需满足rand()%5 (2)在选择第二个元素时:需满足转载 2011-11-25 11:32:19 · 1102 阅读 · 0 评论 -
带通配符的字符串匹配问题
字符串匹配问题,给定一串字符串,按照指定规则对其进行匹配,并将匹配的结果保存至output数组中,多个匹配项用空格间隔,最后一个不需要空格。要求:匹配规则中包含通配符?和*,其中?表示匹配任意一个字符,*表示匹配任意多个(>=0)字符。匹配规则要求匹配最大的字符子串,例如a*d,匹配abbdd而非abbd,即最大匹配子串。匹配后的输入串不再进行匹配,从当前匹转载 2014-06-04 11:05:38 · 2205 阅读 · 0 评论