分治法思想与体会

  分治,即分而治之,是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题的解合并得到原文题的解。其算法设计模式如下:

divide-and-conquer(P){

  if (|P|<=n0)

    adhoc(P);

  divide P into smaller subinstances P1,P2,...,Pk;

  for (i=1; i<=k; i++)

    yi = divide-and-conquer(Pi);

  return merge(y1,y2,...,yk);

在人们大量的实践中,发现在用分治法的时候,使子问题规模大致相同是最好的,,而许多问题中,将一个问题分成大小相等的k个子问题的处理方法(一般情况下k=2)几乎总是比子文体规模不等的好。

  对分治法深有体会的一次是第一次结对编程那会的第二题。原先老师还没要求时间复杂度为O(log2 n)时,我是直接在main函数里直接写了if进行判断的,然后一堆的判断语句。把时间复杂度扩大到了O(n)。后来就开始思索要怎样将复杂度变小。当时是明确知道要用二分法才能将时间复杂度变小,但还不知道怎么在find函数里添加语句进行判断。用二分法就可以将时间复杂度变为O(log2 n)。后来加上了下面这两个语句。

  if(x<a[l]) cout<<l-1<<" "<<l;//以a[l]为界,如果x在a[l]左边,那么输出l以及l+1

  if(x>a[l]) cout<<l<<" "<<l+1;//如果x在a[l]左边,那么输出l-1以及l

  

  然后瞬间把10几行if判断的语句缩减成两行,又降低了计算的时间复杂度,就觉得很神奇。解决问题有很多方法,但既然已经是第二年学习C++编程了,就要对自己有更高的要求,追求简洁及时间、空间复杂度降到最优的算法,这也是算法课存在的意义,也是你学了那么久编程的意义。打题还是要多思考,多严格要求自己,不能想着投机取巧,单纯完成题目就好。

  接下来就是对结对编程情况的汇报。

  觉得结对编程挺好的,因为结对编程,不仅关乎自己完成作业的情况,还关乎队友的。这个时候,你就会因为不好意思而要求自己做得好一点,不要拖累队友,也不能将编程任务全部推脱出去。在这一背后推力下,就能“迫使”自己往前走,从而有了进步。而且又可以一起思考,一起讨论,能更快的发现新解题思路,更快完成任务。

原文地址:https://www.cnblogs.com/wen-05/p/11671078.html

时间: 2024-10-02 11:51:42

分治法思想与体会的相关文章

对分治法思想的体会及结对编程情况汇报

1.对分治法思想的体会 分治法就是将问题分解为规模更小的子问题,通过一一解决这些子问题,再将这些已经解决了的子问题合并起来,就得到了原问题的解.通过分治法的思想,我们可以更加轻松的解决规模很大的问题,也使得代码更加清晰,易于理解.我们在大一的时候其实已经接触过分治法的思想了,像二分查找,就是利用了分治法思想,使得查找算法的时间复杂度更低. 2.结对编程情况汇报 我和我的搭档一般情况下是独立编程,但是当我们其中一个或着两个人遇到编程难题时,就会互相讨论,一起寻找合适的算法去解决问题. 在之后的学习

对分治法思想的体会 &amp; 结对编程情况汇报

一.对分治思想的体会 1.帮助我们解决问题. 分治法,对大的问题拆封成规模较小的问题,我们求解小问题,再把小问题的答案合并起来,得出大问题的答案.大问题思考起来比较乱,犯迷糊,不易想到解决方法,比如汉诺塔问题.分解成小问题,我们就容易想出方法来解决问题 2.时间复杂度低 分治法思想核心是递归,递归的时间复杂度低.算法的复杂度低,提高了算法的质量 二.结对编程情况汇报 3道题都做完且答案正确,第三道题,没有按时间复杂度为O(logn)编程,后来查找资料知道如何写出O(logn)的算法.第一题,开始

对分治法思想的体会

分治法的基本思想是什么? 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 更准确地说是,将规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归地解决子问题,然后将解合并得到原问题的解. 什么情况下使用分治法? 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决: 2) 该问题可以分解为若干个规模较小的与原问题相同的问题: 3) 利用该问题分解出的子问题的解可以合并为该问

基于分治法的找秩(maxium rank finding)策略

rank finding 问题的概述如下: 在一群离散的点中,检查对于每个点,是否有x值和y值都小于它的点,若有,则该点的秩为这些小于它的点的数量. 分治法思想: 以界面上所有点中x值的中位数为基准,递归地把目标区域分成两部分,直到每个区域中的点在一个以下,对于每一个细小的区域,检查其left child区域中的点的y值和right child区域中的点的y值,以对right child中的点的秩进行统计. 该方法通过分治排除了水平位置不符合标准的点,有效的减少了统计次数. 代码示例如下: #i

2.3.1 分治法

插入排序使用了增量方法:在排序子数组A[1..j-1]后,将单个元素A[j]插入子数组的适当位置,产生排序好的子数组A[1..j]. 分治法,该算法的最坏情况运行时间比插入排序要少得多.分治算法的优点之一是,通过使用第4章介绍的技术往往很容易确定其运行时间. 分治法 许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题.这些算法典型地遵循分治法思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子

【分治法】最接近点对问题(转)

转自:http://blog.csdn.net/liufeng_king/article/details/8484284 问题场景:在应用中,常用诸如点.圆等简单的几何对象代表现实世界中的实体.在涉及这些几何对象的问题中,常需要了解其邻域中其他几何对象的信息.例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来看待,则具有最大碰撞危险的2架飞机,就是这个空间中最接近的一对点.这类问题是计算几何学中研究的基本问题之一. 问题描述:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,

递归与分治法

分治法思想 把问题分解为k个规模较小的子问题,这些子问题(互相独立且)结构与原来问题的结构相同,再递归地求解这些子问题. 问题分解成子问题:(divide) 当达到某个阈值n0时,给出直接求解的方法:(conquer) 最后把各个子问题的解合并起来,得到原来问题的解:(merge) 算法设计伪代码 时间复杂性 分析分治法的运行时间,先列出递归方程,例如 典型例子 mergesort等 原文地址:https://www.cnblogs.com/eniac1946/p/8733531.html

动态规划和分治法,贪心算法以及递归的再一次深刻理解和体会

每次体会算法都有新的感觉,刷题越多,对算法的理解感觉也就越深刻. 下面我们来重新体会下分治法,动态规划,贪心法,递归的理解. 1.分治法: 将问题分成单独的阶段,每个阶段互相不干扰很独立,如10米长的木棍,切成10段,每段去解决每一段的问题.(阶段没有关系) 2.贪心法 站在全局的角度,也是将问题堪称分为多个阶段,只不过阶段和阶段之间有一定的递进关系,如从5毛,1元,2毛,1毛,2元中,去找最少的钱币构成10块钱.首先是站在全局的角度,先从中取其最大值,为第一阶段,然后在从剩余的当中在找最大值,

专题:分治法

分治法(Divide and Conquer) 作为五大算法之一的分治法,可算是最早接触的一种算法.分治法,与其说是一种算法,不如将其称为策略来的更贴切一些.算法的思想就是将大问题分成小问题,并解决小问题之后合并起来生成大问题的解. 分治法的精髓: 分--将问题分解为规模更小的子问题: 治--将这些规模更小的子问题逐个击破: 合--将已解决的子问题合并,最终得出“母”问题的解: 分治法的作用,自然是让程序更加快速地处理问题.比如一个n的问题分解成两个n/2的问题,并由两个人来完成,效率就会快一些