代码改变世界

随笔分类 -  Algorithm

【转】数据是怎么被压缩的

2011-06-30 23:53 by Aga.J, 351 阅读, 收藏, 编辑
摘要: 链接:http://news.cnblogs.com/n/106983/回答问题之前先来看看什么是压缩。当你有天走在路上,碰见熟人对你说:“吃了?”你一定知道他是在打招呼,既不是要请客也不是让你“没吃赶紧回家吃 去”。这一句简单的“吃了”是礼貌和问好的体现,也是一种信息的压缩。笼统地说,把一系列已有信息通过一定方法处理,使得其长度缩短,并且信息含量基本或者完全不变,就称之为压缩。 计算机上的压缩过程 我们都知道,计算机采用的是2进制系统。一个连续的n位二进制数集,就可以用来表示 2 n 个字符。目前的国际标准是ASCII码:用一个字节即8位数的2进制码,来表示各种字符和字母。 现在我们只使用2 阅读全文

A*算法理论与实践

2011-06-17 15:44 by Aga.J, 390 阅读, 收藏, 编辑
摘要: 连接:http://www.java3z.com/cwbwebhome/article/article2/2825.html文章有带flash展示,可以看原文连接。[摘要] 本文介绍了启发式算法中一种重要而有效的算法------A*算法的理论,并给出了寻路问题的交互式实现。[关键词] A*,启发式算法,最优路径,交互,AS2[历史回顾]P. E. Hart , N. J. Nilsson 和B. Raphael共同发表了一篇在启发式搜索方面有深远影响力的论文:“P. E. Hart, N. J. Nilsson, and B. Raphael. A formal basis for the h 阅读全文

字符串匹配算法之Sunday算法的学习笔记

2011-04-24 19:56 by Aga.J, 1880 阅读, 收藏, 编辑
摘要: Sunday算法是一种比KMP和BM更加高效的匹配算法,它的思想跟BM算法相似,在匹配进行时,Sunday算法失败时关注的是源字符串中当前参加匹配的长度为M(模式串的长度)的最后一位字符的下一个字符。如果该字符不在模式串中出现,那么就将直接跳过,即移动步长=模式串的长度+1,否则,则移动步长=模式串中最右端的该字符到末尾的距离加1。 假设我们要匹配”HERE IS A SIMPLE EXAMPLE”和”EXAMPLE” Text: HERE IS A SIMPLE EXAMPLE Pattern:EXAMPLE 我们从源串的初始位置开始和模式串比较,发现第一个就不匹配了,这时候如果使用. 阅读全文

平衡二叉树之AVL树的学习比较

2011-04-19 12:01 by Aga.J, 1146 阅读, 收藏, 编辑
摘要: 平衡二叉树(这里就不解释了):给予不同的平衡条件,造就出不同的效率表现,以及不同的实现复杂度,AVL ,RB, AA都是一种平衡二叉树,因为维护平衡,所以插入和删除节点的平均时间长了,但是可以避免不平衡的情况,所以元素的搜寻访问时间短了!而最直观的平衡条件是整棵树的深度为logN,也就是说要求每个节点的左右子树有相同的高度(递归定义的结果就是该树的叶子节点都在同一层上!) 接下来是AVL树 : AVL树,原名是Adelson-Velskii-Landis tree,它没有像上述那个条件要求那么苛刻,它允许任何节点的左右子树的高度相差1,(递归定义的结构就是该树的叶子节点只可以在最后一层和倒数. 阅读全文

字符串匹配算法Rabin-Karp 算法的学习笔记

2011-04-16 22:11 by Aga.J, 987 阅读, 收藏, 编辑
摘要: 该算法的思想是,通过对模式字符串进行hash运算,同时对源字符串取长度跟模式字符串相等的子字符串也进行hash运算,最后比较hash值来确定模式字符串是否和源字符串的子串匹配,并获得其匹配起始位置。 什么叫做hash运算呢?把串看作是字符集(这个串中的字符是属于某个字符集的)长度进制的数(比如数字串'’123”的字符集就是0到9,属于10进制,将数字串转换为相应的10进制数进行比较),由“数”的比较得出字符串的比较结果。例如,给定字符集为∑ ={0,1,2,3,4,5,6,7,8,9} ,∑长度为 d=10 ,那么任何以∑为字符集的串都可看作 d (此处为 10 )进制的数。 设模式串 阅读全文

最长公共子串算法的学习笔记

2011-04-16 20:01 by Aga.J, 445 阅读, 收藏, 编辑
摘要: Longest Common Subsequence最长公共子串算法原理:1 将两个字符串分别以行和列组成矩阵2 计算每个节点的行和列的字符是否相同,如果相同则为13 通过找出值为1的最长对角线就可以得到最长公共子串(在第3步中可以这样优化算法,就是把相同字符所在的位置的值加上左上角d[i-1][j-1]的值,这样就可以获得最长公共子串的长度,更可以得到公共子串是什么)这个算法的原理很浅显易懂,很快理解为什么可以这样做,所以这里就不赘述了。直接贴出来自网络的参考代码。public static string LCS(string s1,string s2){if(s1==s2)return s 阅读全文

字符串相似度算法《Levenshtein Distance》的学习笔记

2011-04-16 00:51 by Aga.J, 3222 阅读, 收藏, 编辑
摘要: 今天在这个博客中http://www.cppblog.com/whncpp/archive/2008/09/21/62378.html看到了这样的一个问题: 一个字符串可以通过“增加一个字符”,“删除一个字符”,“替换一个字符”,从而得到另一个字符串,假设我们从字符串A转换为字符串B,前面3种操作所执行的最少次数就是A和B的相似度。求该最小次数。 如 abc adc 度为 1 ababababa babababab 度为 2 abcd acdb 度为2 那是相当有趣啊,哈哈,博客中介绍了这个问题最常用的解决算法--Levenshtein Distance,下面就来介绍下这个算法如何来解决这个. 阅读全文

分治算法的学习笔记

2011-04-14 00:22 by Aga.J, 691 阅读, 收藏, 编辑
摘要: 分治算法一个简单的可以利用分治思想来解决的问题是在一个一维数组中找到最大值和最小值,最暴力的做法就是分两次完成,第一次从数组中找到最大值,第二次从数组中找到最小值。这种方法并不高效,比较次数多,而原因是 在选择最大值,最小值的时候是“孤立”的进行的,并不利用上次比较的信息【重点,利用上次比较的信息!】。使用分治法可以避免这个缺点。算法实现如下:Void getMaxAndMin(int list[],int &max, int &min, int low, int high) //low,high是分治的必须{If(low == high ) { max= list[low]; 阅读全文

KMP算法的学习笔记

2011-04-12 01:29 by Aga.J, 415 阅读, 收藏, 编辑
摘要: 串的模式匹配问题:从主串中找到子串第一次出现的位置解决:1) Brute-Force算法最简单的算法就是将子串的第一个字符与主串的第一个字符比较,如果匹配,则比较两者的下一个字符,如果失败,则将子串的第一个字符和主串的第一个比较字符的下一个字符进行比较,重复上述操作,直到子串匹配完成或者结束。最好情况下,只需要m次比较(m为子串长度)即可完成。当子串的第0个字符和主串的每一个字符都不同的,比较次数为n-m+1,而当每次匹配时,子串前面的所有字符都和主串的相应字符相同,但是最后一个字符不同,这样一来就需要比较(n-m+1)*m次,因为每次匹配失败可以看做是【当子串的第0个字符和主串的每一个字符都 阅读全文

解题思路之树型结构

2011-03-10 10:51 by Aga.J, 498 阅读, 收藏, 编辑
摘要: 有一类求一组解,或者求全部解,或者求最优解的问题,可以利用 “试探”和“回溯”的搜索技术来求解。例如:求含n个元素的集合的幂集合(全集)解法一:“分治法”进行“递归算法设计”, 递归规定义:基本项(终结状态) + 归纳项(如何从当前状态转化到终结状态,也就是原问题和子问题之间的转化)递归设计的实质:当一个复杂的问题可以分解为若干子问题来处理时,其中某些子问题和原问题有相同的特征属性,则可以利用和源问题相同的分析处理方法。(例如汉诺塔的问题中,可以分解为3个子问题,(1)将编号为1至n-1的n-1个圆盘从X塔座移到Y塔座;(2)将编号为n的圆盘从X塔座移到Z塔座(3)将编号为1至n-1的圆盘从Y 阅读全文

【好文要转】面试时算法题的解答思路

2011-03-02 00:22 by Aga.J, 273 阅读, 收藏, 编辑
摘要: 面试中纯粹考算法的问题一般是让很多程序员朋友痛恨的,这里分享下我对于解答算法题的一些思路和技巧。一般关于算法的文章,都是从经典算法讲起,一种一种算法介绍,见得算法多了,自然就有了感悟,但如此学习花费的时间和精力却是过于巨大,也不适合在博客里面交流。这一篇文,却是专门讲快捷思路的,很多人面对算法题的时候几乎是脑子里一片空白,这一篇文章讲的就是从题目下手,把毫无思路的题目打开一个缺口的几种常见技巧。(一)由简至繁事实上,很多问题确实是很难在第一时间内得到正确的思路的,这时候可以尝试一种由简至繁的思路。首先把问题规模缩小到非常容易解答的地步。[题目]有足够量的2分、5分、1分硬币,请问凑齐1元钱有多 阅读全文

一维向量中查找任何相邻子向量的最大和

2010-08-02 22:02 by Aga.J, 1598 阅读, 收藏, 编辑
摘要: 今天看到《编程珠玑》的第八章,里面提出了这个问题: 文章给了四种不同级别的算法,从n的三次方的时间开销到n的时间开销,在给出第2种算法(只需要n的平方,并且我第一次做的话也是这种做法)后,文章问读者能不能给出更快速的方法,于是我放下了书,自己想了想:一开始想到的是一个递归的算法,每次遇到负数时都跳过,直到再次遇到正数,这时候已经形成了递归子式,然后递归返回是什么呢?就是拿递归子式和进行该递归前的所有负数之和进行比较,如果它们之和大于零则继续递归返回,如果小于零则抛弃。 但是这个算法实现起来比较麻烦,要记录的现场比较多,然后就继续想了想,突然想到,要是向量总是从负数开始,那么前面的负数在一开始. 阅读全文

Fermi problem

2010-08-02 00:26 by Aga.J, 1161 阅读, 收藏, 编辑
摘要: Fermi problem—今天看了《编程珠玑》的第七章封底计算,google一下,发现封底计算原来有那么大学问,就记录了一些找到的资料 简介:封底计算,英文为back-of-the-envelope calculations (BotEC),这个术语由诺贝尔物理学奖得主Enrico Fermi创造 费米问题(FERMI QUESTION/PROBLEM)就是在信息不完整的情况下,凭借对对象事物的深刻理解和洞察,科学地作出一些假设使得问题得以简化,复杂的程度得以降低,从而得到符合或接近实际的估计。它的原理是,在任何一组计算里,错误往往会相互抵消。由于错误的估计往往相互补偿,其计算结果将趋向于正 阅读全文