算法讨论
文章平均质量分 75
zhouyayong09
这个作者很懒,什么都没留下…
展开
-
递归与分治策略之二分搜索算法
二分搜索算法是运用分治策略的典型例子二分搜索算法充分利用了元素之间的次序关系(二分搜索的算法是基于有序列)采用分治策略,可在最坏情况下用O(logn)时间完成搜索任务。二分搜索算法的基本思想是将n个元素分成个数大致相同的两半,去a[n/2]与x作比较。如果x = a[n/2],则找到x,算法终止;如果x a[n/2],则只在数组a的右半部继续搜索。具体算法可描述如下:template原创 2012-11-04 09:05:40 · 2244 阅读 · 0 评论 -
递归与分治策略之线性选择(第k小元素)
这次与大家一起讨论的问题是在面试题中经常出现的一个。问题描述:给定一个线性序列,让你用O(n)的时间复杂度找到第k小元素(1 看到这一题的第一印象就是排序,然后遍历找到第k小元素,可是题目要求是用O(n)的时间复杂度。当k = 1时就是找最小元素;当k = n时,就是找最大元素;很显然在时间复杂度为O(n)的时间内都能完成。对于一般的选择问题,似乎在O(n)的时间为很难完成。但实原创 2012-11-04 10:58:20 · 1083 阅读 · 2 评论 -
递归与分治策略之棋盘覆盖问题
棋盘覆盖 在一个2^k * 2^k 个方格组成的棋盘中,若恰好有一个方格与其他方格不同,则称该房改为一特殊方格,且称该棋盘为一特殊棋盘。显然特殊方格在棋盘上出现的位置有4^k种情况。 在棋盘覆盖问题中,要用如下图所示的4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重复覆盖。可知,在任何一个2^k * 2^k的棋盘覆盖中原创 2012-11-04 09:46:13 · 846 阅读 · 0 评论 -
堆和哈希表的实现以及应用(一)
首先我来和大家一起了解一下堆的一些问题。堆是一个非常实用的数据结构,在一些算法的优化和一些高级数据结构上都能用到堆。比如优先队列、hash_map、迪杰斯特拉算法(最短路的优化)等等,所以我们大家学好堆是有必要的,对我们学习高深的一些算法和数据结构非常的有用。 我所知道的堆有已下几种:二叉堆(就是我们平常说的堆)、二项堆、斐波那契堆;其中后者都是前者的优化。今天呢,由于我的水平有限原创 2012-11-06 11:21:59 · 569 阅读 · 0 评论 -
堆和哈希表的实现与应用(二)
堆的应用对于堆的应用,我最熟悉的例子就是堆排序了(以升序排列为例)。算法思想:建立大根堆,每次取出根结点,与最后一个叶子节点就行交换,然后维持大根堆;依次递归实现堆排序。如下描述: const int HEAP_SIZE = 1000;const int MAXN = 100000;templatevoid Max_Heap(T h[], int p, int heap_siz原创 2012-11-06 15:26:00 · 395 阅读 · 0 评论 -
程序员面试100题之对称字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。大家一看题目,经常做面试题的同学,就知道这题是微软的面试题。 分析1:我看到这道题目的第一印象就是模拟,从字符串的首字母开始,一个个比较。我们需要用O(n^3)的时间复杂度完成。具体描述可如下代码:#include #inclu原创 2012-11-10 10:20:01 · 404 阅读 · 0 评论 -
递归与分治策略之快速排序
我在前面的文章中写道:递归与分治策略之线性选择,在其中提到求在一个序列中第k小元素;它实现的算法思想就是利用快速排序的算法思想,那我们现在就一起探讨一下快速排序。 快速排序算法也是基于分治策略的一个排序算法,当然还有另外一个归并排序,也是基于分治策略的。其算法思想:对于输入的子数组a[p:r],按一下三个步骤进行排序;(1)分解:以a[p]为基准元素将a[p:r],划分成3段a[p,q原创 2012-11-10 18:26:23 · 710 阅读 · 0 评论