Algorithm
文章平均质量分 86
狮子座明仔
有理想,有激情,态度改变人生 github:https://github.com/shibing624
展开
-
经典算法题03-猴子吃桃
问题描述: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了。原创 2016-05-27 16:55:57 · 1090 阅读 · 0 评论 -
经典算法题08-协同过滤算法
相信大家对如下的类别都很熟悉,很多网站都有类似如下的功能,“商品推荐”,”猜你喜欢“。在实体店中我们有导购来为我们服务,在网络上我们需要同样的一种替代物,如果简简单单的在数据库里面去捞,去比较,几乎是完成不了的,这时我们就需要一种协同推荐算法,来高效的推荐浏览者喜欢的商品。一:概念协同过滤算法(Collaborative Filtering),SlopeOne的思想很简单,就是用均值化的思想来掩盖个原创 2016-06-21 15:11:16 · 995 阅读 · 0 评论 -
经典算法题09-字符串模式匹配KMP
一. 提问字符串模式匹配指的是,找出特定的字符串在一个较长的字符串中出现的位置。 有一个长字符串”ababcabababdc”,请问子串”babdc”出现的位置是哪里?二. 思路在字符串模式匹配的学习中,可能首先就会想起将模式字符串和目标字符串逐个去比较,直到匹配为止,这就BF(Brute Force)算法(称为“朴素”算法或者暴力算法),这算法的确可行,但是不高效。BF(Brute Forc原创 2016-06-29 12:38:46 · 3306 阅读 · 0 评论 -
经典算法题10-AhoChorasick
引入现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题。当然你可以用KMP(Knuth-Morris-Pratt algorithm)算法求出,那么它的时间复杂度为O(c*(m+n)),c:为模式串的个数。m:为模式串的长度,n:为正文的长度,那么这个复杂度就不再是线性了,我们学算法就是希望能把要解决的问题优化到极致,这不,Aho-Chorasick自动机就派上用场了。原创 2016-08-04 15:03:24 · 614 阅读 · 0 评论 -
经典算法题11-Huffman编码
一. 引入赫夫曼(Huffman)树又称最优二叉树,也就是带权路径最短的树。二. 概念有几个概念,在wiki上也有说明:节点的权: 节点中红色部分就是权,在实际应用中,我们用“字符”出现的次数作为权。路径长度:可以理解成该节点到根节点的层数,比如:“A”到根节点的路径长度为3。树的路径长度:各个叶子节点到根节点的路径长度总和。赫夫曼树也就是带权路径长度最小的一棵树。三.示例构建Huffman原创 2016-11-17 09:41:14 · 2462 阅读 · 0 评论 -
经典算法题13-并查集算法
这一篇我们看看经典又神奇的并查集,顾名思义就是并起来查,可用于处理一些不相交集合的秒杀。一. 问题有时候我们会遇到这样的场景,比如下面这道题,杭电1232畅通工程:畅通工程Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 48855 Ac原创 2016-11-30 14:42:19 · 1261 阅读 · 0 评论 -
经典算法题14-外排序
引入我们要处理一个大文件,对其中的数值排序,一般我们想到的方法就是用排序算法,像快速排序、归并排序、选择排序、堆排序、冒泡排序等。但是这些排序算法使用的前提是需要把数据读入到内存,现在大文件太大,内存装不下,如何处理?这时我们就要用外排序(External sorting)。介绍外排序是指能够处理极大量数据的排序算法。归并(merge)排序算法中用到了分治思想,一个大问题我们可以采取分而治之,各个突原创 2016-12-02 12:28:31 · 725 阅读 · 0 评论 -
经典算法题12-贪心算法
一. 引入在日常生活中,经常遇到找零钱的问题。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?很显然,每一步尽可能用面值大的纸币即可。这就是日常生活中贪心算法思想的使用。二. 概念百度百科的定义是: 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。原创 2016-11-21 21:23:39 · 1796 阅读 · 0 评论 -
经典算法题15-稀疏矩阵及三元组
一. 引入我们知道矩阵是一个非常强大的数据结构,在动态规划以及各种图论算法上都有广泛的应用。当然矩阵有着不足的地方就是空间和时间复杂度都维持在N²上,比如1w个数字建立一个矩阵,在内存中会占用1w*1w=1亿的类型空间,这时就会遇到outofmemory。。。那么面临的一个问题就是如何来压缩矩阵,当然压缩的方式有很多种,这里就介绍一个顺序表的压缩方式:三元组。二. 介绍三元组有时候我们的矩阵中只有零原创 2016-12-07 16:45:09 · 6173 阅读 · 0 评论 -
Bootstrap,Bagging,Boosting
Bootstrap(自助法)引入Bootstrap,即“自助法”,是用小样本来估计大样本的统计方法。核心思想子样本之于样本,可以类比样本之于总体思想解析举个栗子 你要统计你们小区里男女比例,可是你全部知道整个小区的人分别是男还是女很麻烦对吧。 于是你搬了个板凳坐在小区门口,花了十五分钟去数,准备了200张小纸条,有一个男的走过去,你就拿出一个小纸条写上“M”,有一个女的过去你就写一个“原创 2016-12-21 22:45:33 · 1112 阅读 · 0 评论 -
隐马尔科夫模型(Hidden Markov Model,HMM)
wiki上有定义:隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。原创 2016-09-01 17:59:44 · 17967 阅读 · 8 评论 -
经典算法题04-动态规划算法(背包问题)
本来我是想解决公共最长子序列问题,但是在解题过程中需要先清楚动态规划算法,故先用动态规划算法中最经典的背包问题来说明。背包问题问题描述有N件物品和一个容量为V的背包,第i件物品的费用是c[i],价值是w[i],求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大? 实际生活中的例子可以描述为小偷那个袋子去偷东西,拿什么东西装满袋子才能获取最大价值?这个问题的特点是:每种物原创 2016-05-31 10:29:23 · 4909 阅读 · 0 评论 -
树状数组
树状数组(Binary Indexed Trees or Fenwick_tree)介绍Wiki中对树状数组的介绍说:按照Peter M. Fenwick的说法,正如所有的整数都可以表示成2的幂和,我们也可以把一串序列表示成一系列子序列的和。采用这个想法,我们可将一个前缀和划分成多个子序列的和,而划分的方法与数的2的幂和具有极其相似的方式。一方面,子序列的个数是其二进制表示中1的个数,另一方面,子序原创 2016-08-05 12:38:40 · 472 阅读 · 0 评论 -
SVM算法原理解析
我把原文作者的系列博客总结成一篇文章,便于前后对照着理解。转自:http://www.blogjava.net/zhenandaci/category/31868.html(一)SVM的简介支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问转载 2016-05-18 14:47:17 · 3045 阅读 · 0 评论 -
Trie树
Trie树(字典树)方法介绍1.1、什么是Trie树Trie树,即字典树,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是最大限度地减少无谓的字符串比较,查询效率比较高。Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:根节点不包含字符,除原创 2016-06-24 11:53:01 · 876 阅读 · 0 评论 -
经典算法题01-百钱百鸡
百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。分析:估计现在小学生都能手工推算这套题, 手工推算结果如图: 只不过我们用计算机来推算,我们可以设公鸡为x,母鸡为y,小鸡为z,那么我们 可以得出如下的不定方程, x+原创 2016-05-23 10:11:53 · 1055 阅读 · 0 评论 -
经典算法题02-五家共井
问题描述古代数学巨著《九章算数》中有这么一道题叫 “五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及。意思就是说:五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水;乙家的绳子用三条不够,还要再用丙家的绳子一条才能打到井水;丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井原创 2016-05-24 15:24:32 · 1028 阅读 · 0 评论 -
经典算法题05-完全背包问题
完全背包(CompletePack)问题有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 完全背包按其思路仍然可以用一个二维数组来写出: f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}例题问题来源:题目Problem原创 2016-06-13 12:39:40 · 797 阅读 · 0 评论 -
经典算法题06-最长子序列
一:作用 最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,是基本功。二:概念举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个,比如其中的cb,cgs等等都是其子序列,我们可以看出子序列不见得一定是连续的,连续的那是子串。 我想大家已经了解了子序列的概念,那现在可以延伸到两个字符串了,那么大家能够看出:cnblogs和belong的公共子序列吗?在你原创 2016-06-14 10:54:49 · 788 阅读 · 0 评论 -
经典算法题07-最短编辑距离
这篇我们看看最长公共子序列的另一个版本,求字符串相似度(求最短编辑距离),这是一个非常实用的算法,在DNA对比,网页聚类等方面都有用武之地。一:概念 对于两个字符串A和B,通过基本的增删改将字符串A改成B,或者将B改成A,在改变的过程中我们使用的最少步骤称之为“编辑距离”。比如如下的字符串:dcgaedcb我们通过种种操作,痉挛之后编辑距离为3,不知道你看出来了没有?二:解析设A和B是2个字原创 2016-06-16 10:24:01 · 632 阅读 · 0 评论 -
中文分词原理和实现
三大主流分词方法:基于词典的方法、基于规则的方法和基于统计的方法。1、基于规则或词典的方法 定义:按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。按照扫描方向的不同:正向匹配和逆向匹配 按照长度的不同:最大匹配和最小匹配1.1正向最大匹配思想MM从左向右取待切分汉语句的m个字符作为匹配字段,m为大机器词典中最长词条个数。查找大机器词原创 2016-06-17 11:22:15 · 31839 阅读 · 2 评论 -
二叉查找树
二叉查找树(binary search tree,又叫二叉搜索树或者二叉排序树)是一种非常重要的数据结构,许多高级树结构都是二叉查找树的变种,例如AVL树、红黑树等,理解二叉查找树对于后续树结构的学习有很好的作用。同时利用二叉查找树可以进行排序,称为二叉排序,也是很重要的一种思想。本文主要参考算法导论,详细介绍二叉查找树的原理及具体的python和java代码实现。1.定义查找树是一种数据结构,它支原创 2016-06-22 12:37:45 · 7412 阅读 · 0 评论 -
距离及相似度度量方法
前言关于距离度量的方法的专题其实已经想做好久了,正好趁这个机会总结出来。这里讨论的距离度量应该是向量空间内的度量,两个点(即两个向量)之间的距离或相似性的度量。每种度量包括描述、定义和公式、优缺点、应用等部分。本文涵盖一下几个度量方法:欧氏距离; 曼哈顿距离; 切比雪夫距离; 闵可夫斯基距离; 标准化欧氏距离; 马氏距离; 巴氏距离 汉明距离; 夹角余弦; 相关系数与相关距离。原创 2016-12-22 17:51:48 · 16426 阅读 · 1 评论