课外闲谈9.谈一谈分治法和在线处理等常见方法

简介: 将整个问题分解成若干个小问题后再分而治之。如果觉得得到的子问题的规模还是太大,那就继续分解,直到得到的子问题规模达到要求。必要时逐步合并这些子问题的解,从而得到问题的解。

首先,我们要知道,什么是分治法?分治法有什么用?什么情况下使用?这些就是比较正常的想法了,好啦,我们接下来开始分析。


一,什么是分治法?


将整个问题分解成若干个小问题后再分而治之。如果觉得得到的子问题的规模还是太大,那就继续分解,直到得到的子问题规模达到要求。必要时逐步合并这些子问题的解,从而得到问题的解。


大家是不是觉得很眼熟?


是不是很像递归的过程,规模逐渐减小。所以,一般来说,分治算法一般由递归来实现。因为分治法就是反映的大规模问题和小规模问题之间的关系。


int Max3(int a, int b, int c) {
  return a > b ? a > c ? a : c : b > c ? b : c;
}
int DivideAndConquer(int List[], int left, int right) {
  //分治法求List[left]到List[right]的最小子列和
  int MaxLeftSum, MaxRightSum;//存放左右子问题的解
  int MaxLeftBorderSum, MaxRightBoderSum;//存放跨分界线的结果
  int LeftBorderSum, RightBorderSum;
  int center, i;
  if (left == right) {//递归的结束条件,子列只有一个数字
    if (List[left] > 0)
      return List[left];
    else return 0;
  }
//下面是分的过程
  //找到中分点
  center = (left + right) / 2;
  //递归求两边子列的最大和 
  MaxLeftSum = DivideAndConquer(List, left, center);
  MaxRightBoderSum = DivideAndConquer(List, center + 1, right);
  //下面求跨分界线最大子列和
  MaxLeftBorderSum = 0;
  LeftBorderSum = 0;
  for (i = center; i >= left; i--) {
    LeftBorderSum += List[i];
    if (LeftBorderSum > MaxLeftBorderSum)
      MaxLeftBorderSum = LeftBorderSum;
  }
  //左边扫描结束
  MaxRightBoderSum = 0;
  RightBorderSum = 0;
  for (i = center + 1; i <= right; i++) {
    RightBorderSum += List[i];
    if (RightBorderSum > MaxRightBoderSum)
      MaxRightBoderSum = RightBorderSum;
  }
  //右边扫描结束
  //最后进行比较
  return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBoderSum);
}
int MaxSubseqsum3(int List[],int N) {
  return DivideAndConquer(List, 0, N - 1);
}


二,在线处理


“在线”的意思是指每输入一个数据就进行即时处理,得到的结果是对于当前已经读入的所有数据都成立的解,即在任何地方中止输入,算法都能正确给出正确的解。


这种算法并不要求存储序列中的数据,只需要一个一个读入,同时一个一个处理即可,处理过的数据没必要存储,可以说是最快的算法了。


int MaxSubseqSum4(int List[], int N) {
  int i;
  int ThisSum, MaxSum;
  ThisSum = MaxSum = 0;
  for (i = 0; i < N; i++)
  {
    ThisSum += List[i];
    if (ThisSum > MaxSum)
      MaxSum = ThisSum;
    else if (ThisSum < 0)
      ThisSum = 0;
  }
  return MaxSum;
}
目录
相关文章
|
18天前
|
人工智能 vr&ar
程序与技术分享:147.命题逻辑
程序与技术分享:147.命题逻辑
|
7月前
|
设计模式 架构师 Java
牛皮了!世界级架构师,图解面向对象编程,小学生都能看得懂
面向对象编程(Object-oriented Programming,缩写:OOP)是软件工程中一种具有对象概念的编程范式(Programming Paradigm),同时也是一种程序开发的抽象方针,与之对应的编程范式还有:函数式编程(Functional Programming)、过程式编程(Procedural Programming)、响应式编程(Reactive Programming)等。
|
运维 算法 架构师
又爆新作!阿里甩出架构师进阶必备神仙笔记,底层知识全梳理
据有关数据表明,目前Java程序员这个群体的数量不减反增,行业内的竞争也是越来越严重。在同一时间入行的人,经过一段时间的学习后,差距就会显示出来。其实出现这样的原因大多数都是因为学习的方向出了问题。大多数人学Java刚开始只是为了快速就业,但是在工作了之后却没有一个好的学习路线,那些其实很重要的东西只是因为工作上用不到从而忽略掉了,慢慢的才发现自己与别人之间已经存在很大差距了!
|
算法
谈一谈|浅谈单纯形法其中奥妙
谈一谈|浅谈单纯形法其中奥妙
149 0
|
存储 算法
给我三分钟,带你领略热血江湖中的并查集算法
给我三分钟,带你领略热血江湖中的并查集算法
给我三分钟,带你领略热血江湖中的并查集算法
|
算法
简单的讲懂KMP算法(配图最细保姆级手把手教会!!)
简单的讲懂KMP算法(配图最细保姆级手把手教会!!)
185 0
简单的讲懂KMP算法(配图最细保姆级手把手教会!!)
|
存储 运维 Kubernetes
独家交付秘籍之招式拆解(第一回)
上一回说到经历种种交付难题的王小锤一行人,意外发现一本交付秘籍,打开了新世界。本次他们带着具体交付场景来到阿里云,与交付宗师阿莫探讨秘籍中的招式以及招式背后的秘密。
独家交付秘籍之招式拆解(第一回)
职场风云系列:那些有名的职场问题分析思路,一次讲给你听
无论是即将迈入社会接受社会毒打的大学生,还是已经在职场多年的职场老司机,实际都需要了解一些职场常用的做事套路以及问题分析的方法论。只有这样在遇到一些实际问题的时候,我们才能根据已有的做事套路以及法法论来进行应对,不至于让自己陷入手忙脚乱的困境之中。
职场风云系列:那些有名的职场问题分析思路,一次讲给你听
|
运维 监控 Java
【运维趟坑回忆录 开篇】初入初创, 一脸懵
前言 距离vpc和容器化过去了快一年, 一直想要完整回顾梳理下整个过程, 最近准备进行swarm->kubernetes的二次迁移, 正好借由这次契机重新回顾下这段历从最初原始时代到vpc,swarm容器化到k8s的经历.
1689 0
|
C++
c++基础(上) 听课流水账
1、pass by value /   pass  by  pointer  /   pass  by  reference   pass by value:实参和形参不是同一个值,因此交换的是形参的值,当函数swap结束后,a和b的值并没有发生交换 pass  by pointer  and  pass by reference :实参和形参是相同的。
1251 0