从《Cash》谈一类分治算法的应用

合集下载

分治算法在特定领域问题求解中的应用

分治算法在特定领域问题求解中的应用

分治算法在特定领域问题求解中的应用示例文章篇一:《分治算法在特定领域问题求解中的应用》嗨,大家好!今天咱们来聊聊分治算法在特定领域问题求解中的应用。

这分治算法呀,就像是把一个大蛋糕切成小块来吃一样。

先说说在排序中的应用吧。

就好比我们有一堆乱乱的数字,要给它们从小到大排序。

分治算法就像一个聪明的小管家。

它把这一堆数字分成两堆,再把每一堆又分成更小的堆,就像把大蛋糕分成小块那样。

比如说快速排序这个算法,它选一个数当作基准,然后把比这个数小的放在左边,比这个数大的放在右边,这就相当于先把大蛋糕分成了两块。

然后再对这两块继续这样分呀分,直到每一块都只有一个数字了,那这时候再把它们按照顺序组合起来,就得到了排好序的数字啦。

这时候我就想啊,这算法怎么这么聪明呢?要是让我自己去排这么多数字,那得排到什么时候去呀。

再看看在计算几何中的应用吧。

想象一下我们有很多形状,三角形、四边形啥的,要找出它们之间的关系,比如说有没有重叠啊,距离有多远啊。

分治算法又开始发挥它的魔力啦。

它把这些形状分成不同的组,就像把小朋友分成不同的小组一样。

然后再对每个小组进行分析,这样就不会觉得那么复杂啦。

我在书上看到一个例子,要计算很多个点之间的最近距离。

分治算法把这些点分成左右两部分,先分别计算左右两部分内部的最近距离,然后再考虑跨左右两部分的点之间的最近距离。

这就好像先把一个大操场分成两半,先在每一半里面找最近的两个小伙伴,然后再看看从这两半里各选一个小伙伴,他们之间的最近距离是多少。

这多有条理呀,我当时就觉得这分治算法就像是一个超级侦探,能把复杂的几何问题一个个解开。

在矩阵乘法里分治算法也有用武之地呢。

矩阵就像一个大表格,里面有好多数字。

如果直接按照普通的方法去相乘,那计算量可大啦。

分治算法就会把大矩阵分成小矩阵,就像把一个大拼图分成小拼图块。

然后再把这些小矩阵相乘,最后组合起来得到结果。

我和同学讨论这个的时候,同学还不信呢,他说这怎么可能更简单呢?我就给他举了个例子,就像我们搬很多砖头,如果一块一块搬很累,但是如果我们把砖头分成几堆,一堆一堆搬就轻松多啦。

分治法的简单描述

分治法的简单描述

分治法的简单描述分治法是一种算法设计的思想,它将一个大问题分解为多个小问题,通过解决小问题来解决大问题。

这种思想的应用非常广泛,可以用来解决各种问题,比如排序、查找、计算等等。

下面我们来详细介绍一下分治法的基本原理和应用。

分治法的基本原理是将一个问题分解为多个独立的子问题,然后对每个子问题进行求解,最后将子问题的解合并起来得到原问题的解。

这种分解和合并的过程可以递归地进行,直到问题变得足够简单,可以直接求解为止。

在应用分治法解决问题时,需要满足以下三个条件:1.原问题可以分解为多个独立的子问题;2.子问题的结构与原问题相同,只是规模更小;3.子问题的解可以合并得到原问题的解。

接下来我们来看两个分治法的经典应用:归并排序和快速排序。

归并排序是一种经典的排序算法,它的基本思想就是使用分治法将一个无序的序列分解为多个有序的子序列,然后再将这些子序列合并起来得到一个有序的序列。

具体的步骤如下:1.将序列分成两个子序列,分别对这两个子序列进行归并排序;2.将两个有序的子序列合并成一个有序的序列。

归并排序的时间复杂度为O(nlogn),其中n是序列的长度。

它的空间复杂度为O(n),其中n是序列的长度。

快速排序是另一种经典的排序算法,它的基本思想也是使用分治法将一个无序的序列分解为多个有序的子序列,然后再将这些子序列合并起来得到一个有序的序列。

具体的步骤如下:1.从序列中选择一个元素作为基准值,将序列分成两个子序列,一个小于基准值,一个大于基准值;2.分别对这两个子序列进行快速排序;3.将两个有序的子序列合并成一个有序的序列。

快速排序的时间复杂度取决于基准值的选择,最坏情况下的时间复杂度为O(n^2),其中n是序列的长度。

但是平均情况下的时间复杂度为O(nlogn),空间复杂度为O(logn)。

除了排序问题,分治法还可以应用于其他一些问题,比如最大子数组和问题。

给定一个整数数组,找到一个具有最大和的连续子数组。

如何应用分治算法求解问题

如何应用分治算法求解问题

如何应用分治算法求解问题分治算法,英文名为Divide and Conquer Algorithm,是一种高效的算法设计策略,在计算机科学中有着广泛的应用。

该算法将一个大问题分解成多个小问题,各自独立地解决,再将结果合并起来得到最终结果。

在本文中,我们将阐述如何应用分治算法求解问题,并通过几个实例来具体说明该算法的应用。

一、分治算法的原理分治算法的核心思想是将一个大问题分解成若干个小问题来解决,然后将这些小问题的解组合起来生成大问题的解。

其具体步骤如下:1. 分解:将原问题划分成若干个规模较小的子问题。

2. 解决:递归地解决每个子问题。

如果子问题足够小,则直接求解。

3. 合并:将所有子问题的解合并成原问题的解。

分治算法的主要优点在于它可以有效地缩小问题规模,从而缩短整个算法的执行时间。

另外,该算法天然适用于并行计算,因为每个子问题都是独立求解的。

二、分治算法的应用分治算法在各种领域都有广泛应用,包括数学、自然科学、计算机科学等。

以计算机科学领域为例,分治算法常常用于解决以下类型的问题:1. 排序问题2. 查找问题3. 字符串匹配问题4. 最大子序列和问题5. 矩阵乘法问题6. 图形问题下面我们将一一讲解这些问题的分治算法实现。

1. 排序问题排序问题是在一组数据中将其按指定规律进行排列的问题。

在计算机科学中,排序算法是十分重要的一类算法。

其中,分治算法由于其高效性和可并行性被广泛应用。

常用的分治排序算法包括归并排序和快速排序。

归并排序的基本思想是将待排序元素以中心点为界分成两个序列,对每个序列进行排序,然后将两个序列合并成一个有序序列;而快速排序则利用了分割的思想,通过每次选取一个元素作为“轴点”,将数组分成小于轴点和大于轴点的两部分,对这两部分分别进行快速排序。

2. 查找问题查找问题是在一组数据中寻找某个元素的问题。

分治算法在查找问题中的应用主要体现在二分查找中。

在二分查找中,我们首先将已排序的数组分成两半,在其中一半中查找目标值。

分治算法及其应用

分治算法及其应用

分治算法及其应用分治算法是一种常见的算法思想,它主要的思想是将一个问题分解为多个子问题,分别求解后再将其合并为原问题的解。

分治算法在计算机科学中有着广泛的应用,例如排序、搜索、图像处理等领域。

1.基本思想分治算法的基本思想是将一个大问题分解为若干个相似的子问题,并递归地求解这些子问题,最后将结果合并成原问题的解。

例如,在求解一个大数组的排序问题时,可以先将数组分成两个子数组,再对每个子数组进行排序,最后将两个子数组合并成一个有序的数组。

2.实现分治算法的实现通常采用递归的方法。

在递归过程中,每次将大问题分解为若干个子问题,然后将子问题递归地求解,直到子问题无法再分解,然后进行合并。

以归并排序为例,该算法分为分解、解决和合并三个过程。

首先将一个大数组分解为两个相等的子数组,然后递归地对子数组进行排序,最后将两个有序的子数组合并成一个有序的数组。

3.算法复杂度分治算法的复杂度主要取决于子问题规模和分解子问题的方式。

通常情况下,分治算法的时间复杂度可以表示为:T(n) = aT(n/b) + f(n)其中,a是每个递归过程的次数,b是子问题规模,f(n)是除了递归外的其他操作的复杂度。

根据主定理,当a>b^d时,算法复杂度为O(n^logb a),否则算法复杂度为O(n^d)。

4.应用分治算法在计算机科学中有广泛应用,例如排序、搜索、图像处理等领域。

归并排序、快速排序、堆排序等都是基于分治算法实现的排序算法。

在搜索领域,二分查找算法就是一种基于分治思想的搜索算法。

在图像处理领域,分治算法可以用来实现图像的分割、匹配等操作。

例如,可以将一幅图像分解成若干个子图像,然后对每个子图像进行处理,最后将处理结果合并成原图像的结果。

总之,分治算法是一种非常重要的算法思想,它能够解决很多复杂的问题,并且在实际应用中取得了很好的效果。

分治算法举例范文

分治算法举例范文

分治算法举例范文分治算法是一种很重要的算法思想,它将一个大的问题划分成较小的子问题,然后分别求解这些子问题,最后将子问题的解合并起来得到原问题的解。

下面我将详细介绍分治算法的几个经典例子。

1. 快速排序(Quick Sort)快速排序是一种经典的使用分治算法的排序算法。

它首先选择一个基准元素,然后将数组划分成两个子数组:小于基准元素的和大于基准元素的。

然后对这两个子数组分别递归地进行快速排序,最后将两个子数组合并起来即可得到有序的数组。

快速排序的时间复杂度为O(nlogn)。

2. 归并排序(Merge Sort)归并排序也是一种利用分治思想的排序算法。

它将待排序的数组划分成两个子数组,然后分别对这两个子数组进行归并排序,最后将两个有序的子数组合并成一个有序的数组。

归并排序的时间复杂度也是O(nlogn)。

3. 汉诺塔问题(Tower of Hanoi)汉诺塔问题是数学领域中一个经典的问题,也可以通过分治算法来解决。

问题的规模是将n个圆盘从一个柱子移动到另一个柱子上,移动时需要遵守以下规则:每次只能移动一个盘子,移动过程中不能将较大的盘子放在较小的盘子上。

可以将问题划分成三个子问题:将前n-1个盘子从起始柱子移动到中间柱子上,将最后一个盘子从起始柱子移动到目标柱子上,最后将前n-1个盘子从中间柱子移动到目标柱子上。

这样就可以递归地求解子问题,最后合并起来得到原问题的解。

4. 最大子数组和问题(Maximum Subarray)最大子数组和问题是求解给定数组中连续子数组的最大和的问题。

可以使用分治算法来解决这个问题。

首先将数组划分成两个子数组,然后分别求解这两个子数组中的最大子数组和。

接下来,需要考虑跨越中点的情况,即包含中点的子数组的最大和。

最后,将这三种情况中的最大值作为最终的结果。

最大子数组和问题的时间复杂度为O(nlogn)。

5. 矩阵乘法(Matrix Multiplication)矩阵乘法也可以通过分治算法来实现。

算法中可以利用分治法的场景是

算法中可以利用分治法的场景是

算法中可以利用分治法的场景是
在计算机科学与技术领域中,分治法(Divide and Conquer) 是一种常见的算法思想。

分治法的理解其实很简单,直接按照字面的意思理解就可以:“分而治之”。

分(divide)是将一个大的问题分解成一些小的问题分别求解,治(conquer)则是将分解的问题答案合并在一起,整个过程则是分而治之。

这个算法技巧是很多算法的基础,我们之前学过的快速排序,其中就有分治思想的应用。

分治法的应用场景:
实例1: 二分搜索
二分搜索是一种很常见的搜索策略,他的核心思想也是利用到分治算法。

二分搜索是在一个有序的数组中,通过均匀二分,每次折半查找,就是应用到分治法中将大问题缩减到小问题,这个小问题的最后结果就是刚好找到需要查找搜索的元素,这样小问题得出解,这个解也是最开始的待搜索的元素。

实例2: 全排列问题
现实生活中,我们经常会遇见这样的场景,比如有 3 个小朋友排成一列,问你一共有多少种可以排列的情况,这个问题类似于数学中的全排列问题,这个时候利用分治算法也可以很好地进行求解。

先依次从三个小朋友中选择一位排在队列最前面,剩下的两个小朋友可以进行全排列,也可以继续拆分,二者选择其一进行即可,这个时候其实很清楚,他们只有两种排列情况了,然后跟前面的小朋友排列组合在一起。

分治算法主方法

分治算法主方法

分治算法主方法分治算法是一种算法设计策略,将问题分解成若干个规模较小且结构相似的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解。

分治算法主方法是指应用分治策略解决问题的通用模板,下面将详细介绍分治算法主方法的原理和应用。

一、原理分治算法主方法包含三个步骤:分解、解决和合并。

1. 分解:将原问题分解成若干个规模较小且结构相似的子问题。

分解的策略可以根据具体问题的特点来确定,通常是将原问题划分成两个或多个规模相等或相近的子问题。

2. 解决:递归地解决子问题。

当子问题的规模足够小时,可以直接求解。

否则,继续将子问题分解成更小的子问题,直到可以直接求解为止。

3. 合并:将子问题的解合并成原问题的解。

子问题的解可以通过递归得到,合并的操作可以根据具体问题的要求进行,通常是将子问题的解组合起来得到原问题的解。

二、应用分治算法主方法可以应用于解决各种问题,下面列举几个常见的应用场景。

1. 排序问题:如归并排序、快速排序等。

这些排序算法通过将待排序序列分解成若干个规模较小的子序列,然后递归地排序这些子序列,并将排好序的子序列合并起来得到最终的有序序列。

2. 查找问题:如二分查找。

二分查找通过将待查找的有序序列分解成两个规模相等的子序列,然后递归地在其中一个子序列中查找目标元素。

如果找到了目标元素,则返回其索引;如果未找到,则继续在另一个子序列中查找。

3. 求解最大子数组问题:给定一个整数数组,求其连续子数组中和最大的值。

最大子数组问题可以通过分治算法主方法求解。

将原数组分解成两个规模相等的子数组,分别求解左子数组和右子数组的最大子数组和,然后将其合并起来得到原数组的最大子数组和。

4. 求解最近对问题:给定平面上的n个点,求其中距离最近的两个点。

最近对问题可以通过分治算法主方法求解。

将平面上的点按照横坐标进行排序,然后将点集分解成两个规模相等的子集,分别求解左子集和右子集的最近对,然后将其合并起来得到原点集的最近对。

分治算法如何利用分治策略解决实际问题

分治算法如何利用分治策略解决实际问题

分治算法如何利用分治策略解决实际问题引言:分治算法是一种非常常见且有效的算法思想,它通过将一个复杂问题分解成若干个子问题来解决。

这种算法可以应用于各种实际问题,并在许多领域中取得了广泛的应用。

本文将介绍分治算法的基本原理以及如何利用分治策略来解决实际问题。

1. 分治算法的基本原理分治算法的基本原理是将一个大问题划分为多个独立的子问题,然后逐个解决这些子问题,并最后将它们的结果合并起来得到最终的解答。

该算法包括三个步骤:分解、解决和合并。

1.1 分解首先,将原始问题分解成多个规模较小、相互独立的子问题。

这些子问题可以具有相同的性质,并且它们的解决方法相同。

1.2 解决接下来,递归地解决这些子问题。

如果子问题足够小,可以直接求解并得到结果。

1.3 合并最后,将子问题的解答合并起来,得到原始问题的解答。

在某些情况下,合并这些解决得到的子问题的结果可能需要额外的计算或处理。

2. 实际问题中的分治策略应用现在,我们将介绍如何在实际问题中应用分治策略来解决问题。

以下是几个常见的实例:2.1 归并排序归并排序是分治算法的经典应用之一。

它将待排序的数组分为两个子数组,然后分别对这两个子数组进行排序。

最后,将排序好的子数组合并成一个有序的数组。

这种分治策略可以大大提高排序的效率。

2.2 汉诺塔问题汉诺塔问题是一个经典的递归问题,也可以通过分治策略来解决。

该问题的目标是将一堆大小不同的盘子从一个柱子上移动到另一个柱子上,且在移动过程中要保持较小的盘子在较大的盘子上方。

解决该问题的方法是将问题分解为移动最大盘子以外的子问题,然后递归地解决这些子问题。

2.3 最大子数组和问题最大子数组和问题是在一个整数数组中寻找连续子数组的和的最大值。

这个问题可以使用分治策略来解决。

将问题划分为左半部分、右半部分和跨越中点的子问题。

最后,将这三者的最大值作为最终的结果返回。

3. 分治策略的优缺点分治策略具有一些优点和缺点,我们来看看它们是什么。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从《Cash》谈一类分治算法的应用
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.分治算法非常基础,但是分治的思想却非常重要,本文将从今年NOI 的一道动态规划问题Cash开始谈如何利用分治思想来解决一类与维护决策有关的问题:
例一.货币兑换(Cash)1
问题描述
小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A
.每个持有金券的顾
纪念券(以下简称A券)和B纪念券(以下简称B券)
客都有一个自己的帐户.金券的数目可以是一个实数.
每天随着市场的起伏波动,两种金券都有自己当时的价值,即每一单位金
券当天可以兑换的人民币数目.我们记录第K天中A券和B券的价值
分别为A
K 和B K(元/单位金券).
为了方便顾客,金券交易所提供了一种非常方便的交易方式:比例交易法.比例交易法分为两个方面:
A) 卖出金券:顾客提供一个[0,100]内的实数OP 作为卖出比例,其意义为:将OP%的A券和OP%的B券以当时的价值兑换为人民币;
B) 买入金券:顾客支付IP 元人民币,交易所将会兑换给用户总价值为IP 的金券,并且,满足提供给顾客的A券和B券的比例在第K天恰好为Rate K;
例如,假定接下来 3 天内的A
假定在第一天时,用户手中有100 元人民币但是没有任何金
券.用户可以执行以下的操作:
1NOI 2007,货币兑换
注意到,同一天内可以进行多次操作.
小Y 是一个很有经济头脑的员工,通过较长时间的运作和行情测算,
他已经知道了未来N天内的A券和B券的价值以及Rate.他还希望
能够计算出来,如果开始时拥有S元钱,那么N天后最多能够获得多少元钱.
算法分析
不难确立动态规划的方程:
设f [i]表示第i天将所有的钱全部兑换成A, B券,最多可以得到多少A券.很容易可以得到一个O(n2)的算法:
f [1]←S * Rate[1] / (A[1] * Rate[1] + B[1])
Ans←S
For i← 2 to n
For j← 1 to i-1
x←f [j] * A[i] + f [j] / Rate[j] * B[i]
If x > Ans
Then Ans←x
End For
f [i] ←Ans * Rate[i] / (A[i] * Rate[i] + B[i])
End For
Print(Ans)
O(n2)的算法显然无法胜任题目的数据规模.我们来分析对于i的两个决策j 和k,决策j比决策k优当且仅当:
(f [j] –f [k]) * A[i] + (f [j] / Rate[j] –f [k] / Rate[k]) * B[i] > 0.
不妨设f [j] < f [k],g[j] = f [j] / Rate[j],那么
(g[j] –g[k]) / (f[j] –f[k]) < -a[i] / b[i].
这样我们就可以用平衡树以f [j]为关键字来维护一个凸线,平衡树维护一个点
集(f [j], g[j]),f [j]是单调递增的,相邻两个点的斜率是单调递减的.每次在平衡树中二分查找与-a[i] / b[i]最接近的两点之间的斜率.
这样动态规划的时间复杂度就降低为O(n log2n),但是维护凸线的平衡树实在不容易在考场中写对 ,编程复杂度高,不易调试(我的Splay代码有6k多).这个问题看上去只能用高级数据结构来维护决策的单调性,事实上我们可以利用分治的思想来提出一个编程复杂度比较低的方法:
对于每一个i,它的决策j的范围为1~i-1.我们定义一个Solve过程:Solve(l, r)表示对于的l ≤i ≤r,用l≤j ≤i-1的决策j来更新f [i]的值.这样我们的目标就是Solve(1, n):可以先Solve(1, n/2)后计算出f [1] .. f[n/2],那么1~n/2的每一个数一定是n/2+1~n的每个i的决策,用1~n/2的决策来更新n/2+1~n的f[i]值后Solve(n/2+1, n).这恰好体现的是一种分治的思想:
用1~n/2的决策来更新n/2+1~n的f[i]值:类似用平衡树的方法,我们可以对1~n/2的所有决策建立一个凸线,对n/2+1~n的所有i按照-a[i] / b[i]从大到小排序,凸线的斜率是单调的,-a[i]/b[i]也是单调的,这样我们就可以通过一遍扫描来计算出对于每一个i在1~n/2里面最优的决策j.
现在面临的问题是如何对于一段区间[l, r]维护出它的凸线:由于f[]值是临时计算出来的,我们只需要递归的时候利用归并排序将每一段按照f[]值从小到大排序,凸线可以临时用一个栈O(n)计算得出.下面给一个分治算法的流程:
由于-a[i] / b[i]是已知的,不像f [i]是临时计算得出的.因此可以利用归并排序预处理,计算每一段[l, r]按照-a[i] / b[i]排序后的i.
Procedure Solve(l, r)
If l = r
Then更新ans,利用已经计算好的l的最优决策k,计算f [l]值,Exit
Mid← (l + r) / 2
Solve(l, mid -1)
对[l, mid-1]这一段扫描一遍计算出决策的凸线,由于[mid+1 .. r]这一段以-a[i] / b[i]的排序在预处理已经完成,因此只需要扫描一遍更新[mid + 1 .. r]的最优决策.
Solve(mid+1, r)
利用[l, mid-1]已排好序的f []值和[mid+1, r]已排好序的f []值归并排序将[l, r]这一段按f[]值排序.
End Procedure
至此,问题已经基本解决.时间复杂度为T(n) = 2T(n/2) + O(n),因此算法的时间复杂度为O(n log2n),NOI2007的测试数据最慢的测试点0.2s,是一个相当优秀的算法.
我们比较一下分治算法和用平衡树维护决策的方法:时间复杂度均为O(n log2n),空间复杂度平衡树为O(n),分治为O(n log2n) (预处理-a[i]/b[i]需要O(n log2n)的空间).但是编程复杂度却差别非常大,分治算法实现起来相当简单,对于考场来说无疑是一个非常好的方法.
在编程复杂度非常高的情况下,动态规划维护决策与分治思想很好的结合起来从而降低了编程复杂度,无疑是“柳暗花明又一村”.这种分治思想主要体现在将不断变化的决策转化成一个不变的决策集合,将在线转化为离线.下面我们再来看一个例题:
例二.Mokia2
问题描述
有一个W *W的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作:
1)Add:将格子(x, y)内的数加上A.
2)Query:询问矩阵(x0, y0, x1, y1)内所有格子的数的和.
数据规模:操作1) ≤ 160000,操作2) ≤ 10000,000
≤W.
1≤
000
2
算法分析
这个问题是IOI 2000 Mobile的加强版:Mobile中W≤1000,就可以利用二树状数组在O(log22n)的时间复杂度内维护出操作1)和操作2).这个问题中W很大,开二维树状数组O(W2)的空间显然吃不消,考虑使用动态空间的线段树,最多可能达到操作次数* (log2W)2个节点,也相当大了.考虑使用分治思想来解决问题:将操作1)和操作2)按顺序看成是一个个事件,假设共有Tot个事件,Tot≤170000.类似例题一,我们定义Solve(l, r)表示对于每一个Query操作的事
2Balkan Olympiad in Informatics, 2007
件i,将l ..i-1的Add操作的所有属于i的矩形范围内的数值累加进来.目标是Solve(1, n).
假设计算Solve(L, R),递归Solve(L, Mid),Solve(Mid + 1, r)后,对L .. Mid 的所有Add操作的数值累加到Mid + 1 .. R的所有匹配的Query操作的矩形中.后面这个问题等价于:平面中有p个点,q个矩形,每个点有一个权值,求每个矩形内的点的权值之和.这个问题只需要对所有的点以及矩形的左右边界进行排序,用一维树状数组或线段树在O((p+q)log2W)的时间复杂度即可维护得出.因此问题的总的时间复杂度为O(Tot*log2Tot*log2W),不会高于二维线段树的O(Tot*log2W*log2W)的时间复杂度.
上述这个算法无论是编程复杂度还是空间复杂度都比使用二维线段树优秀,分治思想又一次得到了很好的应用.在这个问题中,利用分治思想我们将一个在线维护的问题转化成一个离线问题,将二维线段树解决的问题降维用一维线段树来解决,使得问题变得更加简单.
总结
【例题一】是一个数据结构维护动态规划决策的问题,【例题二】为一个数据结构维护数据信息的问题.我们巧妙地使用分治思想,将在线维护的问题转化为离线问题,将变化的数据转化为不变的数据,使得问题解决更加的简单.。

相关文档
最新文档