随笔分类 -  算法Algorithm

摘要:最长公共子串(Longest Common Substring)是一个非常经典的面试题目,在实际的程序中也有很高的实用价值,所以把该问题的解法总结在本文重。不过不单单只是写出该问题的基本解决代码而已,关键还是享受把学习算法一步步的优化,让时间和空间复杂度一步步的减少的惊喜。概览最长公共子串问题的基本表述为:给定两个字符串,求出它们之间最长的相同子字符串的长度。最直接的解法自然是找出两个字符串的所有子字符串进行比较看他们是否相同,然后取得相同最长的那个。对于一个长度为n的字符串,它有n(n+1)/2 个非空子串。所以假如两个字符串的长度同为n,通过比较各个子串其算法复杂度大致为O(n4)。这还没 阅读全文
posted @ 2013-07-18 10:27 Ider 阅读(73687) 评论(19) 推荐(10) 编辑
摘要:在《二分查找法的实现和应用汇总》中,我介绍了二分查找法的基本应用,不过在面试的准备过程中,我还碰到了更多对于二分查找法的更进一步的使用。其实在《二分查找法的实现和应用汇总》的最后,我已经介绍了一个非常规的使用,也就是基于“轮转后的有序数组(Rotated Sorted Array)”检查某一个数是否存在。找到轮转后的有序数组中第K小的数对于普通的有序数组来说,这个问题是非常简单的,因为数组中的第K-1个数(即A[K-1])就是所要找的数,时间复杂度是O(1)常量。但是对于轮转后的有序数组,在不知道轮转的偏移位置,我们就没有办法快速定位第K个数了。不过我们还是可以通过二分查找法,在log(n)的 阅读全文
posted @ 2012-09-08 09:45 Ider 阅读(5564) 评论(2) 推荐(1) 编辑
摘要:古语“画虎画皮难画骨”,是说画老虎时要画它的外表很容易,可要将老虎的气势画出来却很难。对于现在的程序员来说,似乎也是这样子,可以写出整洁的代码,设计出优异的程序,但却不一定需要知道代码在编译之后的是如何运行的。但是有时候,能了解表面背后的故事,知道一些程序编译过程,其实对写出一个正确的正确的程序会有很大的帮助,这起源自一段很简单的问题实现:两整数交换。简单的两数交换不简单最早学习到的实现方式,就是使用临时变量来保存一个数进行交换:int main(){ int a = 21; int b = 7; int tmp = a; a = b; b = tmp; ... 阅读全文
posted @ 2012-05-03 12:32 Ider 阅读(7422) 评论(27) 推荐(18) 编辑
摘要:这是一道关于字符串的操作的问题,一开始思考的时候,感觉需要取出各种不同的子序列,如果是这样时间复杂度就会变成指数级别。不过在朋友的指示下,发现其实它是有规律可寻的,最后的算法时间负责度只要O(n),而且代码极其简单。虽然朋友是直接告诉了我其中的规律,但是我还是花了点时间思考和证明了一下,才放心的写下了代码。现在把它总结在这里。整个问题的证明基本是使用数学归纳法,以及奇数和偶数的一些性质。感叹数学的世界真奇妙。也庆幸自己一直以来我十分喜欢数学。其实计算机的世界本来就是建立在各种数学理论之上,比如离散数学,模糊数学,逻辑数学。但是计算机又让数学的应该变得更加的广阔。(你可以在看完题之后直接跳到红色 阅读全文
posted @ 2012-04-13 09:44 Ider 阅读(1756) 评论(0) 推荐(1) 编辑
摘要:在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。时间复杂度按优劣排差不多集中在:O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n)到目前位置,似乎我学到的算法中,时间复杂度是O(log n),好像就数二分查找法,其他的诸如排序算法都是 O(n log n)或者O(n2)。但是也正是因为有二分的 O(log n), 才让很多 O(n2)缩减到只要O(n log n)。关于二分查找法二分查找法主要是解决在“一堆数中找 阅读全文
posted @ 2012-04-01 12:26 Ider 阅读(64269) 评论(12) 推荐(18) 编辑
摘要:以前学运筹学的时候,第一次接触到了贪婪算法,而对于它体现最好的应用貌似就是求最小生成树上了。后来大学时学习算法,看到了贪恋算法在最小生成树上的实现方式,感觉到贪恋的思想真是直观,简洁。但是从那时起到现在对于最小生成树算法的认识也觉得只此一种(后来知道它是Kruskal算法)。直到这学期上课,看了Sanjoy Dasgupta, Christos Papadimitriou, Umesh Vazir... 阅读全文
posted @ 2010-12-03 06:39 Ider 阅读(7219) 评论(2) 推荐(2) 编辑
摘要:在刚进大学学习C语言的时候,用的是谭浩强的那本“经典”教程(之所以加引号是在接触了更多的书籍和经过了高手的指点后,发现它算不上绝对的经典,但是是入门很好的书)。记得好像是在函数那一章的课后习题的第一题让写一个求两个数最大公约数的方法。因为当时是第一次接触C语言不知道这一个经典的题目,所以就直接翻阅答案去了。答案给出的提示就是用欧几里得的“辗转相除法”... 阅读全文
posted @ 2010-11-16 10:42 Ider 阅读(10169) 评论(10) 推荐(0) 编辑


我的围脖

Fly Me