随笔分类 - [41]Algorithm算法
-
压缩软件
摘要:自己动手写压缩软件Posted on2013-09-14 00:28DM张朋飞阅读(1007) 评论(5)编辑收藏 想吃项记的烩面了……这小地方的可难吃。看完了《裸婚时代》,我觉得冬瓜说得对,刘易阳不敢面对自己的真实感受。 女生都是感性的,工作永远不如生活重要。 不是坐在一起就叫团队,不是不吵架就叫态度。 昨晚一哥们说求k小直接可以进行k次冒泡,我都想不起来,我想到的是区间快拍,说明基础很重要。 对原版本的算法有很大修改,个人认为原版代码的命名不太规范,读起来比较累,本程序主要是界面参考了参考资料,读写文件完全是自己搞的(原文字节流,我的字符流),不过原文不可压缩汉字(原版压缩效率高一些),我 阅读全文
-
堆排序
摘要:《算法导论》第六章----堆排序堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。二叉堆有两种:最大堆和最小堆。最大堆的特性是指除了根以外每个节点的值最多和其父节点的值一样大。堆可以被看成是一棵树,其高度为。(练习证明稍后上)保持堆的性质 1 /* 2 *这个函数是维持堆的性质,注意当调用这个函数的时候,我们假定该节点的左右儿子树都是最大堆。 3 *但是有可能该节点小于它的子树,所以通过这个函数使该节点下降,使以该节点为根的子树成为最大堆。 4 */ 5 void max_heapify(int A[], int length, int i){ 6 int l = 2 * i... 阅读全文
-
堆排序详解
摘要:堆排序详解以及java实现前言临近毕业,开始找工作,近期一直在看算法导论(CLRS)同时各种刷题。希望以后有时间把所有学习心得和刷题心得记录下来。堆 堆排序和合并排序一样,是一种时间复杂度为O(nlgn)的算法,同时和插入排序一样,是一种就地排序算法(不需要额外的存储空间)。堆排序需要用到一种被称为最大堆的数据结构,与java或者lisp的gc不一样,这里的堆是一种数据结构,他可以被视为一种完全二叉树,即树里面除了最后一层其他层都是填满的。也正是因为这样,树里面每个节点的子女和双亲节点的序号都可以根据当前节点的序号直接求出。Parent(i)=i/2 Left(i)=2*iRight(i)=2 阅读全文
-
子数组之和最大值
摘要:子数组之和最大值因为最近要开始笔试和面试了,我觉得,很有必要做好准备~这个问题是我在网上看到的,13年一家公司的笔试题,求子数组的最大和。这个题我之前在微软的编程之美看到过,不过当时记得并不是很深刻。现在既然看到了,我就好好的想了想。考试题如下:上面只给了两行代码的空间,也就是说,只需要两行的代码即可。对于这个问题,有种很简单,但是效率最低的方法,就是枚举出全部的子数组,并且求和,比较出最大值。我当初写的代码就是这个版本的,现在应该在实验室的电脑里。但是,在《编程之美》中,对于这个问题提供了三种解法,而且其中的第三种是效率最高的。时间复杂度O(n),空间复杂度为O(1)。其实可以考虑一种比较极 阅读全文
-
Cracking the Coding Interview(Stacks and Queues)
摘要:Cracking the Coding Interview(Stacks and Queues)1.Describe how you could use a single array to implement three stacks.我的思路:一般堆栈的实现会利用一个数组,这里一个数组若实现3个堆栈,直接考虑把数组划分为3个部分,相当于3个独立的数组,所以就有以下的实现。 但是,这种实现方式的缺点在于均分了每个stack需要的space,但是事先无法确定每个stack是否需要更多的space相比于其他的stack。但是针对这个缺陷我没有想到解决的方案。但是书中提供了一种解决思路。... 阅读全文
-
hash_map的简洁实现
摘要:hash_map的简洁实现hash_map是经常被使用的一种数据结构,而其实现方式也是多种多样。如果要求我们使用尽可能简单的方式实现hash_map,具体该如何做呢?我们知道hash_map最重要两个概念是hash函数和冲突解决算法。hash_map键-值之间的映射关系,hash函数将键映射为内存地址,冲突解决算法用于解决不同的键映射为相同地址时候的情况。数据结构和算法导论中介绍了大量的hash函数和冲突解决算法,如果选择实现精简的hash_map,那么可以选择“除留取余法”作为hash函数,选择“开散列地址链”作为冲入解决算法。这样的选择不仅使得hash_map实现简单,而且有很高的查询效率 阅读全文
-
并查集
摘要:并查集并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等。使用并查集时,首先会存在一组不相交的动态集合S={S1,S2,⋯,Sk},一般都会使用一个整数表示集合中的一个元素。每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表。每个集合中具体包含了哪些元素是不关心的,具体选择哪个元素作为代表一般也是不关心的。我们关心的是,对于给定的元素,可以很快的找到这个元素所在的集合(的代表),以及 阅读全文
-
希尔排序
摘要:希尔排序希尔排序(Shell's Sort)又称缩小增量排序(Diminishing Increment Sort),是插入排序的一种改进 基本思想:设定一个元素增量gap,将参加排序的序列按这个间隔数gap从第1个元素开始依次分成若干子序列,对子序列进行排序,然后缩小增量gap,重新将整个序列按照新的间隔数gap进行划分,再分别对每个子序列进行排序,如此将“缩小增量gap——划分序列——将每个子序列进行排序“的操作进行下去,知道间隔数增量gap=1为止; gap间隔数的选择:如何选择最合适的间隔数序列才能达到最优的排序效果是至今尚未解决的数学难题,我们在一般排序中gap的初始值可设定 阅读全文
-
FP-Growth算法及演示程序
摘要:FP-Growth算法及演示程序FP-Growth算法 FP-Growth(频繁模式增长)算法是韩家炜老师在2000年提出的关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-Tree),但仍保留项集关联信息;该算法和Apriori算法最大的不同有两点:第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率。算法伪代码算法:FP-增长。使用FP-树,通过模式段增长,挖掘频繁模式。输入:事务数据库D;最小支持度阈值min_sup。输出:频繁模式的完全集。1. 按以下步骤构造FP-树:(a) 扫描事务数据库D一次。收集频繁项的集合F和它们的支持度。对F按支持 阅读全文
-
常见的动态规划问题分析与求解
摘要:常见的动态规划问题分析与求解动态规划(Dynamic Programming,简称DP),虽然抽象后进行求解的思路并不复杂,但具体的形式千差万别,找出问题的子结构以及通过子结构重新构造最优解的过程很难统一,并不像回溯法具有解决绝大多数问题的银弹(全面解析回溯法:算法框架与问题求解)。为了解决动态规划问题,只能靠多练习、多思考了。本文主要是对一些常见的动态规划题目的收集,希望能有所帮助。难度评级受个人主观影响较大,仅供参考。目录(点击跳转)动态规划求解的一般思路备忘录法1.硬币找零 扩展1:单路取苹果 扩展2:装配线调度2.字符串相似度/编辑距离(edit distance) 应用1:子串... 阅读全文
-
背包问题的动态规划算法
摘要:背包问题的动态规划算法01背包问题我最初学会的解法是回溯法,第一反应并不是用动态规划算法去解答。原因是学习动态规划算法的时候,矩阵连乘、最长公共子串等问题很容易将问题离散化成规模不同的子问题,比较好理解,而对于01背包问题则不容易想到将背包容量离散化抽象出子问题,从情感上先入为主也误以为动态规划算法不是解决01背包问题的好方法,实际上并不是这样的。问题描述:给定n种物品和一背包,物品i的重量是wi,其价值为vi,背包的容量为C,求能装入背包的物品的最大价值。用m(i,j)表示为从i到n的序列装入容量为j的背包能产生的最大价值,则能装入背包的物品最大价值为m(1,C)。递归式为:上面讲到,该问题 阅读全文
-
CodeForces Round
摘要:CodeForces Round 199 Div2完了,这次做扯了,做的时候有点发烧,居然只做出来一道题,差点被绿.My submissions#WhenWhoProblemLangVerdictTimeMemory4434550Sep 9, 2013 11:57:20 AMOIerE - Xenia and TreeGNU C++Accepted842 ms4260 KB4434547Sep 9, 2013 11:56:11 AMOIerE - Xenia and TreeGNU C++Wrong answer on test4280 ms3400 KB4434544Sep 9, 2013 阅读全文
-
希尔排序
摘要:Java实现希尔排序Posted on2013-09-09 12:05DM张朋飞阅读(281) 评论(4)编辑收藏 华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序。如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作)。 看到了这个,我想试试希尔排序,就学学。一.理论准备 希尔排序是基于直接插入排序的,不懂得请看这一篇http://www.cnblogs.com/hxsyl/archive/2013/06/02/3113656.html 希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进,是将整个无序列分割成若干 阅读全文
-
海量数据相似度计算之simhash短文本查找
摘要:海量数据相似度计算之simhash短文本查找海量数据相似度计算之simhash短文本查找在前一篇文章 《海量数据相似度计算之simhash和海明距离》 介绍了simhash的原理,大家应该感觉到了算法的魅力。但是随着业务的增长 simhash的数据也会暴增,如果一天100w,10天就1000w了。我们如果插入一条数据就要去比较1000w次的simhash,计算量还是蛮大,普通PC 比较1000w次海明距离需要 300ms ,和5000w数据比较需要1.8 s。看起来相似度计算不是很慢,还在秒级别。给大家算一笔账就知道了:随着业务增长需要一个小时处理100w次,一个小时为3600 *1000 = 阅读全文
-
计算1至n中数字X出现的次数
摘要:计算1至n中数字X出现的次数描述计算 1 至 n 中数字 X 出现的次数,其中n≥1,X∈[0,9]。解题思路这是一道比较简单的题目,举个例子先:假设n=11,X=1,那么就是求 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 这 11 个数字中 1 出现的次数,很容易能看出来结果为 4,在 1 和 10 中各出现了一次,在 11 中出现了两次。最简单的办法就是依次遍历 1 至 n,再分别求每个数字中 X 出现的次数,代码如下所示:?1234567891011121314151617181920212223#include // 计算数字 X 在 n 中出现的次数。intc 阅读全文
-
数组总结篇(上)
摘要:面试常备题----数组总结篇(上) 数组是我们程序员最常用的数据结构,也是笔试和面试最喜欢出的题型。要想解决好一道数组题,需要的不仅是扎实的编程基础,更重要的是,要有清晰的思路,因为数组题经常是一些见都没有见过的数学题目,需要我们当场分析其中的规律。 考察数组,最主要的是这几个方面:查找,排序,递归和循环,而这往往考察的就是我们编写高效率代码的能力。编写能够运行的代码并不难,但要编写高效的代码却是一门需要花时间的功夫,甚至可以说与天赋挂上钩,有些人天生就是对算法非常敏感,能够一下子掌握算法的精髓。但事实就是,大部分正在编程的程序员都不具备这种能力,就像我一样。 所幸,真正的事实就是:大部分人的 阅读全文
-
后缀数组
摘要:后缀数组1 背景 后缀数组是处理字符串问题的有效算法,如最长公共字串,最长回文字串,重复次数最多的字串等等。所以学好它,对于以后处理处理字符串是很有帮助的。在网上找了下,发现对后缀数组讲的比较容易理解和清楚的是罗穗骞写的关于“后缀数组——处理字符串的有力工具”的论文,这篇文章主要总结下该论文中的主要内容。2 定义 后缀:后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串r 的从第 i 个字符开始的后缀表示为Suffix(i) , 也 就 是Suffix(i)=r[i..len(r)]。 后缀数组:后缀数组 SA 是一个一维数组,它保存 1..n 的某个排列 SA[1],S... 阅读全文
-
算法:字符串消除问题的数学证明
摘要:算法:字符串消除问题的数学证明问题:给定一个字符串,仅由A、B、C3个字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如有AB或BA连续出现,你把它们替换为字母C;有AC或CA连续出现时,你可以把它们替换为字母B;有BC或CB连续出现时,你可以把它们替换为字母A。可以不断反复按照这个规则进行替换,目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度。输入:字符串。长度不超过200,仅由ABC3个字母组成。 输出:按照上述规则不断消除替换,所得到的字符串最短的长度。例如:输入CAB,输出2。因为我们可以把它变为BB或者变为CC。输入BCAB,输出1。我们可以把它变为A 阅读全文
-
十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
摘要:十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果。 在这些庞大的分类方法中,基于直方图的全局二值算法占有了绝对的市场份额,这些算法都从不同的科学层次提出了各自的实施方案,并且这类方法都有着一些共同的特点: 1、简单; 2、算法容易实现;3、执行速度快。 本文摘取了若干种这类方. 阅读全文
-
Cracking the Coding Interview
摘要:Cracking the Coding Interview1.1实现一个算法判断一个字符串是否存在重复字符。如果不能利用另外的数据结构又该如何实现?My solution:?/***利用类似一个hash table的计数*然后检查这个hash table计数,时间复杂度(n)*/intunique_string1(char*array,intlength){intCARRAY[26] = {0};inti;if(length > 26)return0;for(i = 0;i 1)return0;return1;} ?/***直接双重循环检查,时间复杂度O(n^2)*/intunique_ 阅读全文