
算法
文章平均质量分 82
hxz_qlh
彦祖老师 http://hxz.ink
展开
-
字符串匹配:KMP算法
字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上原创 2013-11-01 20:59:02 · 824 阅读 · 0 评论 -
概率随机问题【2】 取样与概率
//************************************// Method: strrpl// FullName: strrpl// Access: public // Returns: void// Qualifier: 字符串替换函数,能替换所有的要替换的字符串,被替换的字符串和替换的字符串不一定一样长.// Parameter: char * pDstOut,原创 2013-10-19 22:57:29 · 2742 阅读 · 0 评论 -
n个元素中取m个元素的组合、排列问题
如A{1,2,3}则有这些组合:a) 1,2,3; b) 12,13,23; c) 123;很显然这是一个组合问题,对于组合最常规的算法无非就是递归或回溯。我们可以把问题分解如下:1)求数组中由1到n个元素的组合f(n,m) (m>=1 && m2)对于f(n,m),我们从数组中任意取一个元素,然后再从剩下的n-1个元素中取m-1个元素,既f(n-1,m-1);3)原创 2013-10-18 19:09:22 · 23085 阅读 · 0 评论 -
包含给定字符集的最小子串
给定一个字符集合 must [0,...,m-1 ] 和一个字符串str [0,...,n-1 ]。假定 n m 。找出 str 中包含 must 中所有字符的最短子串。例如:给一个字符串s1,和一个小串s2,求算法能在s1中找到包含s2里所有字符的最小子串。比如:s1 = “ADOBECODEBANC”s2 = “ABC” 最小子串是 “BANC”,要求O(N)的算法。原创 2013-10-17 20:57:49 · 1686 阅读 · 0 评论 -
最长回文子串
问题描述: 给定一个字符串S=A1A2...An,要求找出其最长回文子串(Longest Palindromic Substring)。所谓回文子串就是S的某个子串Ai...Aj为回文。例如,对字符串S=abcdcbeba,它的回文子串有:bcdcb,cdc,beb,满足题目要求的最长回文子串为bcdcb。推理思路:1.由于回文可能由奇数个字符组成,也可能由偶数个字符原创 2013-10-16 09:48:37 · 901 阅读 · 0 评论 -
求解一个数字的平方根,不用平方根库函数。
分析:这个问题有两个思路:思路1:采用二分的方式(无处不在的二分),上界初始化为数字本身,下界初始化为1,这样用二分,判断中间数字的平方和目标数字比较,再修改上界和下界,直到小于一定的阈值。思路2:采用牛顿法(数值分析中提到),采用微分的方式,从初始点开始,每次迭代,微分求解切线,然后求解切线和x轴的交点,再以这个交点作为起点,迭代进行。比如求解24,那么写出函数:原创 2013-10-15 20:28:12 · 2357 阅读 · 0 评论 -
最长单调递增子序列
最长单调序列的动态规划优化问题 求一个数组的最长递减子序列,比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} 常见的解法是:遍历数组序列,每遍历一个数组元素,则求序列到当前位置最长的递减序列数,用temp[i]存储。注意,当前的最长递减子序列受已经遍历的最长递减子序列影响,从序列头再遍历到当前位置的前一个位置,挨个比较 a[j]原创 2013-10-15 20:06:06 · 1438 阅读 · 0 评论 -
常见的二叉树面试题
面试中,最常见是数据结构就是二叉树和链表了,其中和二叉树有关的常见面试题主要是:树的前序遍历、中序遍历、后序遍历、分层遍历、树的节点数、树的叶子节点数、树的第K层节点数、树的深度、树的宽度、平衡二叉树的判定、完全二叉树的判定、满二叉树的判定,处理这些问题基本思想无外乎是“遍历+递归”。关于树的遍历,递归方式太傻太天真,但也是最基本的思想,实现代码可谓汗牛充栋,在此就不赘述了。下面仅列举了非原创 2013-12-26 14:54:37 · 1796 阅读 · 0 评论 -
算法导论13-4:Treap
花了一晚上终于解决了《算法导论》13-4 中的思考题 Treap,之前学习的时候就发现这块的内容网上都找不到什么参考资料,面对a---j这几个思考题一筹莫展,今晚静下心来好好研究了下,发现也不是那么难啃。搞算法,就是要沉得住气。原创 2014-01-15 22:40:20 · 2522 阅读 · 0 评论 -
2个有序数组合并后的中位数
第一步:假设两个有序数组(已经各自排序完成了)长度相等,试写函数找出两个数组合并后的中位数第二步:假设两个有序数组长度不等,一样的求出中位数解析: 这个题目看起来非常简单。第一题的话: 假设数组长度为n, 那么我就把数组1和数组2直接合并,然后再直接找到中间元素。对于这样的方案,第一题和第一题就没有什么区别了。这样的话时间复杂度就是O(n)。通常在这样的情况下,那些me原创 2013-10-23 18:41:01 · 1871 阅读 · 1 评论 -
概率随机问题【3】给定能随机生成1到5的函数,写出能随机生成1到7的函数
题目:给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一样。现要求使用该函数构造函数rand7(),使函数rand7()可以随机等概率的生成1-7的整数。思路:很多人的第一反应是利用rand5() + rand5()%3来实现rand7()函数,这个方法确实可以产生1-7之间的随机数,但是仔细想想可以发现数字生成的概率是不相等的。rand5原创 2013-10-23 21:01:02 · 4163 阅读 · 1 评论 -
单链表的快速排序
快速排序的算法思想是:确定一个枢轴元素,通过一趟排序将待排关键字分成两个部分,其中一部分元素均比枢轴元素小,另一部分元素均比枢轴元素大,这样的一趟排序称为快速排序的一次划分。再对两个部分分别再递归进行划分操作,最后获得的序列就是排好序的关键字序列。快排算法的实现中采用的存储结构是数组,采用数组有一个好处,就是待排元素可以随机存取。而以单链表方式存储的待排序列就无法随机存取元原创 2013-10-25 20:57:24 · 1875 阅读 · 0 评论 -
顺时针打印矩阵
题目:给定一个矩阵,从外向内顺时针打印矩阵中的每一个数字。例如:给定矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16输出应该为:{1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10} 分析:这道题的意思非常直观,给人的感觉也原创 2013-11-23 16:54:49 · 1240 阅读 · 0 评论 -
连续子数组和的最大值(编程之美错误分析)
输入一个N个元素的整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。 例如输入的数组为-9 -3 -2 2 -1 2 5 -7 1 5,和最大的子数组为2 -1 2 5。因此输出为该子数组的和8。 可是如果都是负数的话,要返回0?还是返回最小的负数?,这个数时候你要问问面试官(交流很重要)。 OK原创 2013-11-10 18:13:25 · 2565 阅读 · 0 评论 -
贪心算法:N位数删除K个数字,使剩下的数字串最小
题目:一个n位的数,去掉其中的k位,问怎样去掉使得留下来的那个(n-k)位的数最大?分析:(删数问题,可用贪心算法求解),方法就是从简单入手,慢慢复杂。从n=1开始推导就会发现规律,现在假设有一个数,124682385,假如k = 1,则结果为12462385,k = 2,结果为1242385……可以知道:最优解是删除出现的第一个左边>右边的数,因为删除之后高位减小,很容易想...原创 2013-11-06 16:16:33 · 10785 阅读 · 2 评论 -
合并K个有序链表O(N lgK)
问题:在O(N lgK) 时间内合并K个有序链表, 这里N指的是K个链表中所有的元素个数。这题的思路如下:1 ) 在每一个链表中取出第一个值,然后把它们放在一个大小为K的数组里,然后把这个数组当成heap,然后把该堆建成最小堆。O(K)2 )取出堆中的最小值(也是数组的第一个值),然后把该最小值所处的链表的下一个值放在数组的第一个位置。如果链表中有一个已经为空(元素已经都被原创 2013-11-01 19:38:51 · 1840 阅读 · 0 评论 -
1024! 末尾有多少个0?
先把答案贴出来,具体证明在下面……末尾0的个数取决于乘法中因子2和5的个数。显然乘法中因子2的个数大于5的个数,所以我们只需统计因子5的个数。是5的倍数的数有: 1024 / 5 = 204个是25的倍数的数有:1024 / 25 = 40个是125的倍数的数有:1024 / 125 = 8个是625的倍数的数有:1024 / 625 = 1个所以1024!原创 2013-10-25 20:09:28 · 4645 阅读 · 0 评论 -
Trie树
一、知识简介 字符串算法中字典树、AC自动机和后缀树的应用是最广泛的了。 字典树(Trie)可以保存一些字符串->值的对应关系。基本上,它跟 Java 的 HashMap 功能相同,都是 key-value 映射,只不过 Trie 的 key 只能是字符串。 Trie 的强大之处就在于它的时间复杂度。它的插入和查询时间复杂度都为 O(k) ,其中 k 为 ke原创 2013-10-25 19:11:17 · 817 阅读 · 0 评论 -
分治法求最近点对
问题描述:给定平面上N个点的坐标,找出距离最近的两个点。 这是编程之美2.11的一道题目,从昨天到现在就一直在设法解决它;如果用常规的解法,只需要将N个点两两计算距离,然后找出最小距离的两个点就可以了;但是这种解法的算法复杂度为O(N^2); 为了降低算法的复杂度,我们需要有更好的方法。这里我们找到的解法是分治法。设点集为S,|S|=N,S的横坐标集合为Sx,纵坐标集原创 2013-10-24 21:55:27 · 2076 阅读 · 2 评论 -
二叉树中节点的最大距离
问题定义如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。《编程之美》的解法书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。情况原创 2013-10-24 13:25:42 · 1171 阅读 · 0 评论 -
"几乎已排序"问题——Is this (almost) sorted?
有大量的n个文件,确定他们是否正确地排序需要Ω(n)的时间。斯内普教授于是决定检查这些文件是否“已几乎排好序”。他想知道是否其中90%的论文已被正确排序:即能否能够去除其中的10%,并让剩下的列表进行排序?原创 2014-01-17 21:31:14 · 2449 阅读 · 0 评论