课外闲谈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天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
18天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
网络协议 前端开发 网络安全
「offer来了」2种递进学习思维,24道计网题目,保姆级巩固你的计网知识体系
该文章通过2种递进学习思维和24道计算机网络题目,系统地巩固了计算机网络的基础知识,包括OSI模型、TCP/IP协议、三次握手与四次挥手的过程及背后的原理,并探讨了DDoS攻击与防御措施等内容。
「offer来了」2种递进学习思维,24道计网题目,保姆级巩固你的计网知识体系
|
6月前
|
人工智能 数据格式 Python
每日一问-ChapGPT-20230308-关于技术与思考的问题
每日一问-ChapGPT-20230308-关于技术与思考的问题
每日一问-ChapGPT-20230308-关于技术与思考的问题
|
11月前
|
消息中间件 设计模式 Java
如何高效地阅读源码,我总结了18条心法,助你修炼神功
大家好,我是三友~~ 这篇文章我准备来聊一聊如何去阅读开源项目的源码。 在聊如何去阅读源码之前,先来简单说一下为什么要去阅读源码,大致可分为以下几点原因: - 最直接的原因,就是面试需要,面试喜欢问源码,读完源码才可以跟面试官battle - 提升自己的编程水平,学习编程思想和和代码技巧 - 熟悉技术实现细节,提高设计能力 - ...
如何高效地阅读源码,我总结了18条心法,助你修炼神功
|
运维 算法 架构师
又爆新作!阿里甩出架构师进阶必备神仙笔记,底层知识全梳理
据有关数据表明,目前Java程序员这个群体的数量不减反增,行业内的竞争也是越来越严重。在同一时间入行的人,经过一段时间的学习后,差距就会显示出来。其实出现这样的原因大多数都是因为学习的方向出了问题。大多数人学Java刚开始只是为了快速就业,但是在工作了之后却没有一个好的学习路线,那些其实很重要的东西只是因为工作上用不到从而忽略掉了,慢慢的才发现自己与别人之间已经存在很大差距了!
|
算法
谈一谈|浅谈单纯形法其中奥妙
谈一谈|浅谈单纯形法其中奥妙
194 0
【自考】第一遍思维导图(经济学+运筹+操作系统)
【自考】第一遍思维导图(经济学+运筹+操作系统)
61 0
|
算法
简单的讲懂KMP算法(配图最细保姆级手把手教会!!)
简单的讲懂KMP算法(配图最细保姆级手把手教会!!)
218 0
简单的讲懂KMP算法(配图最细保姆级手把手教会!!)
|
程序员
盘点关于程序员的那些经典案例
深度剖析几个经典话题,以图文的形式展现,好好看图。
124 0