在上一篇中,通过一个求连续子数组的最大和的例子讲解,想必我们已经大概了然了分治策略和递归式的含义,可能会比较模糊,知道但不能用语言清晰地描述出来。但没关系,我相信通过这篇博文,我们会比较清楚且容易地用自己的话来描述。 通过前面两章的学习,我们已经接触了两个例子:归并排序和子数组最大和。这两个例...
分类:
编程语言 时间:
2015-09-15 21:38:12
阅读次数:
192
1. 引言 这一篇博文首先会介绍基于分治策略的矩阵乘法的Strassen算法,然后会给出几种求解递归式的方法。 2. 矩阵乘法的Strassen算法 ...
分类:
编程语言 时间:
2015-09-13 14:29:28
阅读次数:
301
1. 从一个股价的问题说起 假如你获得了一种可以预测未来某公司股价的能力。下图是你预测的股价情况,那么你会在哪一天买入,哪一天卖出呢? 你可能认为可以在这17天当中的股价最低的那天(第7天)买入,然后在之后的股价最高的那天(第11天)卖出;或者反过来在整段时间内股价最高的那天卖出,然后在之前的股价最...
分类:
编程语言 时间:
2015-09-11 15:57:52
阅读次数:
186
快速排序是目前基于关键字的内部排序算法中平均性能最好的,它采用了分治策略,这既是快速排序的优点也是它的缺点。从快速排序的算法描述上我们可以发现它具有递归的结构: (1)确定一个分界,将待排序的数组分为左、右两个部分; (2)使所有小(大)于临界值的数据移到左部分,大(小)于临界值的数...
分类:
编程语言 时间:
2015-09-11 00:04:09
阅读次数:
252
华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/8/27
首先区分动态规划和分治策略。
这两者有很相似的地方,都是通过组合子问题的解来求解原问题。不同的是,分治策略将原问题划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子问题)。在这...
分类:
编程语言 时间:
2015-08-27 13:34:50
阅读次数:
178
快速排序也是典型的分治策略实现,与归并排序不同,快排的关键部分在于 分 也就是partition部分,快排平均时间复杂度是O(nlgn),最差时间是O(n^2),属于不稳定排序
下面是快排的C语言实现。
//p, r分别是数组中元素的下标
int partition(int A[], int p, int r)
{
int i, j;
i = p - 1;
f...
分类:
编程语言 时间:
2015-08-01 22:06:35
阅读次数:
226
归并排序典型的分治策略的体现,时间复杂度是O(nlgn), 空间复杂度是O(n).属于稳定排序。
下面是C语言实现代码。
#define MAX 10000000
//p, q, r是均是元素的下标
void merge(int A[], int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int...
分类:
编程语言 时间:
2015-08-01 20:37:03
阅读次数:
145
#include#includeusing namespace std;void findOddMin(vector> &a, int m, int n, vector &r){ int len = r.size(); vector tmp; for (int i = 0; i 0) b = r[i...
分类:
其他好文 时间:
2015-07-31 21:42:39
阅读次数:
104
/*
????本问题是求解最大子数组问题
????普通方法的复杂度为n^2
????现在尝试给出一种小于n^2的算法
????当然数组中必须要有负数,不然没有意义
????本例中使用分治策略
*/
#include<stdio...
分类:
编程语言 时间:
2015-07-27 21:14:03
阅读次数:
108
1.问题描述 写一个高效的算法,从一个m×nm\times n的整数矩阵中查找出给定的值,矩阵具有如下特点:
每一行从左到右递增。
每一列从上到下递增。
2. 方法与思路2.1 二分查找法 根据矩阵的特征很容易想到二分法,但是这是一个二维的矩阵,如何将问题转化为一维是关键。实际上我们可以根据矩阵的第一列确定值可能所在的行的范围(limu,limd)(limu,limd),其中limu=0...
分类:
编程语言 时间:
2015-07-23 21:54:29
阅读次数:
114