
算法导论
文章平均质量分 74
JJDiaries
JJ diaries-still-always-forever
展开
-
基于用户投票的排名算法(一):Delicious和Hacker News
作者: 阮一峰日期: 2012年2月24日互联网的出现,意味着"信息大爆炸"。用户担心的,不再是信息太少,而是信息太多。如何从大量信息之中,快速有效地找出最重要的内容,成了互联网的一大核心问题。各种各样的排名算法,是目前过滤信息的主要手段之一。对信息进行排名,意味着将信息按照重要性依次排列,并且及时进行更新。排列的依据,可以基于信息本身的特征,也可以转载 2013-09-19 17:31:52 · 1199 阅读 · 0 评论 -
KMP算法介绍及实现——轻松搞定KMP匹配算法
本文用最简洁易懂的方式介绍了字符串匹配算法中的BF算法和KMP算法。本下一篇将继续介绍Horspool算法和BM算法。现在我们用的大部分软件都含有查找/替换的功能,要完成查找替换功能就需要用到字符串匹配算法。字符串匹配的算法有很多,最著名的字符串匹配算法有:KMP算法,Boyer-Moore(BM)算法。如果要我们自己去实现字符串匹配功能,我原创 2013-10-14 08:49:00 · 4039 阅读 · 0 评论 -
BM算法与Horspool算法及其实现
字符串匹配算法详解(上)介绍了BF算法和KMP算法,这一篇接着来介绍Horspool算法和BM算法。其中Horspool算法相当于是BM算法的特例,或者说是简化版的BM算法。原创 2013-10-16 08:41:36 · 5298 阅读 · 1 评论 -
(五)使用最大堆实现优先级队列
/*******************************************利用最大堆实现最大优先级队列最大优先级支持的操作:1.insert(S,x) //将元素x插入集合S中2.maximum(S) //返回S中最大关键字的元素3.extract(S) //去掉并返回S中最大关键字的元素4.increase_key(S,x,k) //将元素x的关键字的值增加到k,原创 2013-11-16 14:29:58 · 1269 阅读 · 0 评论 -
(二)合并排序
/*************************************分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题; 递归地解决这些子问题,然后再合并其结果,得到原问题的解。分治模式三部曲:分解、解决、合并。合并排序伪代码(使用哨兵):merge(A,p,q,r): n1 <—— q-p+1 n2 <—— r-q cre原创 2013-11-16 14:27:50 · 1124 阅读 · 0 评论 -
(四)快速排序
/*****************************************快速排序伪代码:QUICK_SORT(A,p,r) if(p<r) then q <—— PARTITION(A,p,r) QUICK_SORT(A,p,q-1) QUICK_SORT(A,q+1,r)//核心函数,对数组A[p,原创 2013-11-16 14:29:18 · 1145 阅读 · 0 评论 -
(六)线性选择
/************************************************以期望线性时间做选择:返回数组A[p,r]中第i小的数算法通过分治递归划分,像快排那样,将数组划分成两边,然后根据情况,处理划分后的某一边,算法伪代码如下:select(A,p,r,i) if p=r then return A[p] q<——partion(A原创 2013-11-16 14:30:40 · 1357 阅读 · 0 评论 -
(一)插入排序
/*******************************************算法一:插入排序算法伪代码:insert_sort(A): for j <—— 1 to length[A]-1 do key <—— A[j] //insert A[j] into the sorted sequence A[1...j-1]原创 2013-11-16 14:27:02 · 1309 阅读 · 0 评论 -
(三)堆排序
/*******************************************堆排序,时间复杂度O(nlgn)伪代码:1.下标计算[为与程序对应,下标从0开始]Parent(i): return i/2Left(i): return 2*i+1Right(i): return 2*i+22.使下标i元素为根的的子树成为最大堆MAX_HEAPIFY(原创 2013-11-16 14:28:40 · 1056 阅读 · 0 评论 -
(七)线性堆栈
/****************************************堆栈操作:用数组S[0,n-1]来实现一个至多有n个元素的栈。STACK_EMPYT(S) //判断栈是否为空 if top[S]=-1 then return ture else return falsePUSH(S,x) //将元素x压入栈中 if to原创 2013-11-16 14:31:15 · 1328 阅读 · 0 评论 -
(九)双链表
/*******************************************双链表操作:list_serach list_insert list_delete 相关伪代码://在链表L中查找具有关键字k的元素xlist_search(L,k) x=head[L] while x != NIL and key[x]!=k do x <—— next[x] retur原创 2013-11-16 16:42:45 · 1001 阅读 · 0 评论 -
(十)哈希表
利用链表法解决冲突的构建的一个hash表,最终的示意图如下图所示。下面的代码实现的功能为:将一个网址进行hash,并存放于hash表中。链表节点包含三个元素:1)存放指向存放网址的指针。2)该网址出现的次数。3)指向下一个节点的指针。/*******************************************=================JJ日记=========原创 2013-11-17 20:40:50 · 1432 阅读 · 0 评论 -
(八)循环队列
/****************************************循环队列操作:用数组Q[0,n-1]来实现一个至多有n-1个元素的队列。队列的两个属性:head[Q] and tail[Q]head[Q]指向队列的头tail[Q]指向新元素将要被插入的地方。队列中各个元素的位置为:head[Q],head[Q]+1,...,tail[Q]-1.在最后一个位置要进行“原创 2013-11-16 14:31:50 · 1316 阅读 · 0 评论 -
RSA算法原理(二)
作者: 阮一峰日期: 2013年7月 4日上一次,我介绍了一些数论知识。有了这些知识,我们就可以看懂RSA算法。这是目前地球上最重要的加密算法。六、密钥生成的步骤我们通过一个例子,来理解RSA算法。假设爱丽丝要与鲍勃进行加密通信,她该怎么生成公钥和私钥呢?第一步,随机选择两个不相等的质数p和q。爱丽丝选择了61和53。转载 2013-09-20 08:56:41 · 748 阅读 · 0 评论 -
贝叶斯推断及其互联网应用(一):定理简介
作者: 阮一峰日期: 2011年8月25日一年前的这个时候,我正在翻译Paul Graham的《黑客与画家》。那本书的第八章,写了一个非常具体的技术问题----如何使用贝叶斯推断过滤垃圾邮件(英文版)。我没完全看懂那一章。当时是硬着头皮,按照字面意思把它译出来的。虽然译文质量还可以,但是心里很不舒服,下决心一定要搞懂它。一年过去了,我读了一些概率论文转载 2013-09-20 08:49:37 · 1177 阅读 · 0 评论 -
高斯模糊的算法
作者: 阮一峰日期: 2012年11月14日通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。"模糊"的算法有很多种,其中有一种叫做"高斯模糊"(Gaussian Blur)。它将正态分布(又名"高斯分布")用于图像处理。本文介绍"高斯模糊"的算法,你会看到这是一个非常简单易懂的算法。本质上,它是一种数据平滑技术(dat转载 2013-09-20 08:47:34 · 1028 阅读 · 0 评论 -
基于用户投票的排名算法(三):Stack Overflow
作者: 阮一峰日期: 2012年3月11日上一篇文章,我介绍了Reddit的排名算法。它的特点是,用户可以投赞成票,也可以投反对票。也就是说,除了时间因素以外,只要考虑两个变量就够了。但是,还有一些特定用途的网站,必须考虑更多的因素。世界排名第一的程序员问答社区Stack Overflow,就是这样一个网站。你在上面提出各种关于编程的问题,等转载 2013-09-19 17:34:52 · 1237 阅读 · 0 评论 -
基于用户投票的排名算法(四):牛顿冷却定律
作者: 阮一峰日期: 2012年3月16日这个系列的前三篇,介绍了Hacker News,Reddit和Stack Overflow的排名算法。今天,讨论一个更一般的数学模型。这个系列的每篇文章,都是可以分开读的。但是,为了保证所有人都在同一页上,我再说一下,到目前为止,我们用不同方法,企图解决的都是同一个问题:根据用户的投票,决定最近一段时间内的"热文转载 2013-09-19 17:37:18 · 1102 阅读 · 0 评论 -
相似图片搜索的原理(一)
之前毕业论文做的是图片检索相关研究,当时看到了阮哥的博文,对入门很有指导意义,现在把他的文收藏到自己博客,呵呵.....上个月,Google把"相似图片搜索"正式放上了首页。你可以用一张图片,搜索互联网上所有与它相似的图片。点击搜索框中照相机的图标。一个对话框会出现。你输入网片的网址,或者直接上传图片,Google就会找出与其相似的图片。下面这张转载 2013-09-19 17:42:05 · 1152 阅读 · 0 评论 -
基于用户投票的排名算法(二):Reddit
作者: 阮一峰日期: 2012年3月 7日(不好意思,这个系列中断了近两周,我会尽快在这几天,把后面几篇写完。)上一次,我介绍了Hacker News的排名算法。它的特点是用户只能投赞成票,但是很多网站还允许用户投反对票。就是说,除了好评以外,你还可以给某篇文章差评。Reddit是美国最大的网上社区,它的每个帖子前面都有向上和向下的箭头,分别表示"赞转载 2013-09-19 17:33:33 · 1161 阅读 · 0 评论 -
相似图片搜索的原理(二)
作者: 阮一峰日期: 2013年3月31日二年前,我写了《相似图片搜索的原理》,介绍了一种最简单的实现方法。昨天,我在isnowfy的网站看到,还有其他两种方法也很简单,这里做一些笔记。一、颜色分布法每张图片都可以生成颜色分布的直方图(color histogram)。如果两张图片的直方图很接近,就可以认为它们很相似。任何一种转载 2013-09-19 17:43:39 · 1133 阅读 · 0 评论 -
TF-IDF与余弦相似性的应用(一):自动提取关键词
同样来自阮哥的博文,“爱死阮哥了”像他致敬,文章写得很好...这个标题看上去好像很复杂,其实我要谈的是一个很简单的问题。有一篇很长的文章,我要用计算机提取它的关键词(Automatic Keyphrase extraction),完全不加以人工干预,请问怎样才能正确做到?这个问题涉及到数据挖掘、文本处理、信息检索等很多计算机前沿领域,但是出乎意料的是,有一个非常转载 2013-09-19 17:47:53 · 891 阅读 · 0 评论 -
TF-IDF与余弦相似性的应用(二):找出相似文章
作者: 阮一峰日期: 2013年3月21日上一次,我用TF-IDF算法自动提取关键词。今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章。比如,"Google新闻"在主新闻下方,还提供多条相似的新闻。为了找出相似的文章,需要用到"余弦相似性"(cosine similiarity)。下面,我举一个例子来转载 2013-09-20 08:45:46 · 895 阅读 · 0 评论 -
基于用户投票的排名算法(五):威尔逊区间
作者: 阮一峰日期: 2012年3月20日迄今为止,这个系列都在讨论,如何给出"某个时段"的排名,比如"过去24小时最热门的文章"。但是,很多场合需要的是"所有时段"的排名,比如"最受用户好评的产品"。这时,时间因素就不需要考虑了。这个系列的最后两篇,就研究不考虑时间因素的情况下,如何给出排名。一种常见的错误算法是: 得分 = 赞成票转载 2013-09-20 08:46:41 · 1406 阅读 · 0 评论 -
基于用户投票的排名算法(六):贝叶斯平均
作者: 阮一峰日期: 2012年3月28日(这个系列实在拖得太久,今天是最后一篇。)上一篇介绍了"威尔逊区间",它解决了投票人数过少、导致结果不可信的问题。举例来说,如果只有2个人投票,"威尔逊区间"的下限值会将赞成票的比例大幅拉低。这样做固然保证了排名的可信性,但也带来了另一个问题:排行榜前列总是那些票数最多的项目,新项目或者冷门的项目,很难有出头机会,排转载 2013-09-20 08:47:12 · 1546 阅读 · 0 评论 -
贝叶斯推断及其互联网应用(二):过滤垃圾邮件
作者: 阮一峰日期: 2011年8月27日上一次,我介绍了贝叶斯推断的原理,今天讲如何将它用于垃圾邮件过滤。========================================贝叶斯推断及其互联网应用作者:阮一峰(接上文)七、什么是贝叶斯过滤器?垃圾邮件是一种令人头痛的顽症,困扰着所有的互联网用户。转载 2013-09-20 08:50:12 · 1528 阅读 · 0 评论 -
贝叶斯推断及其互联网应用(三):拼写检查
作者: 阮一峰日期: 2012年10月16日(这个系列的第一部分介绍了贝叶斯定理,第二部分介绍了如何过滤垃圾邮件,今天是第三部分。)使用Google的时候,如果你拼错一个单词,它会提醒你正确的拼法。比如,你不小心输入了seperate。Google告诉你,这个词是不存在的,正确的拼法是separate。这就叫做"拼写检查"(s转载 2013-09-20 08:51:25 · 1066 阅读 · 0 评论 -
RSA算法原理(一)
作者: 阮一峰日期: 2013年6月27日如果你问我,哪一种算法最重要?我可能会回答"公钥加密算法"。因为它是计算机通信安全的基石,保证了加密数据不会被破解。你可以想象一下,信用卡交易被破解的后果。进入正题之前,我先简单介绍一下,什么是"公钥加密算法"。一、一点历史1976年以前,所有的加密方法都是同一种模式:转载 2013-09-20 08:56:05 · 794 阅读 · 0 评论 -
TF-IDF与余弦相似性的应用(三):自动摘要
作者: 阮一峰日期: 2013年3月26日有时候,很简单的数学方法,就可以完成很复杂的任务。这个系列的前两部分就是很好的例子。仅仅依靠统计词频,就能找出关键词和相似文章。虽然它们算不上效果最好的方法,但肯定是最简便易行的方法。今天,依然继续这个主题。讨论如何通过词频,对文章进行自动摘要(Automatic summarization)。如果能转载 2013-09-20 08:46:11 · 903 阅读 · 0 评论 -
(十一)二叉查找树
一颗二叉查找树/*******************************************二叉查找树,支持的操作包括:SERACH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT、DELETE。定理:对于一个高度为h的二叉查找树,操作SERACH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR的运行时间均为原创 2013-11-20 08:28:59 · 1844 阅读 · 0 评论