算法导论 第三节 分治法

2023-10-30

分治法


1 分 把一个大问题分成若干个小问题 即原问题的n变小
2 治 递归的解决每一个子问题,然后把这些子问题的解合并成整个大问题的解

归并排序
1. 一分为二
2. 递归的对每一个子数组进行排序
3. 合并(线性的n时间内就可以完成)

归并排序的时间复杂度

每一个符合分治策略的算法,几乎都有相似形式的递归出现

用主方法计算归并排序的时间复杂度
T(n)=2T(n/2)+θ(n)
用主方法
f(n) = θ(n)
logba = log22 = 1
1 = logba
k=0
故为第二种情况
可得T(n)=θ(nlogn)

二分查找算法

设某个元素为x,你需要在一个已排序的数组中找到这个x

  1. 分 把x与数组的中间元素相比较
  2. 治 因为可以确定x在哪个数组中,所以只在一个子数组中递归
  3. 合 没有计算量

时间复杂度

T(n) = T(n/2)+θ(1),log21 =0,f(n) = θ(1),为第二种情况,k=0,故T(n) = θ(logn)

乘法问题

给定一个数x,实数或浮点数,然后再给定一个正整数n>=0,计算x^n
1. 朴素算法
x*x*x*x*x*x*x*x*x*x……*x = x^n
做n-1次乘法
T(n) = θ(n)
2. 分治法

当n为偶数 x^n = x^(n/2)*x^(n/2)
当n为奇数 x^n = x^(n/2)*x^(n/2)*x
T(n) = T(n/2)+θ(1)=θ(logn)

斐波那契数列

F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*)

递归算法

Time Ω(φ^n),φ=(√5-1)/2

自下而上的递归

F0,F1,F2……FN
Time θ(n)

朴素平方递推式

Fn = φ^n/√5 (不能实现)
根据矩阵
(F(n+1) Fn)= (1 1)^n
(Fn F(n-1))…(1 0)…..=>θ(logn)
归纳法

矩阵乘法

分治法
斯特拉森算法(Strassen)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法导论 第三节 分治法 的相关文章

  • 若干经典基础算法题目练习

    练习1 判断是否为素数 ConsoleAppIsPrime1 cpp 定义控制台应用程序的入口点 函数功能 判断一个输入的数是否为素数 函数原形 bool Prime int x 参数 int x 将要判断的数 返回值 bool型变量 判断
  • 区间图着色问题

    这是算法导论贪心算法一章的一个习题 题目描述 假定有一组活动 我们需要将它们安排到一些教室 任意活动都可以在任意教室进行 我们希望使用最少的教室完成所有的活动 设计一个高效的贪心算法求每个活动应该在哪个教室进行 这个问题称为区间图着色问题
  • 算法导论 第三节 分治法

    分治法 1 分 把一个大问题分成若干个小问题 即原问题的n变小 2 治 递归的解决每一个子问题 然后把这些子问题的解合并成整个大问题的解 归并排序 1 一分为二 2 递归的对每一个子数组进行排序 3 合并 线性的n时间内就可以完成 归并排序
  • 分治法求最大子序列和------使用C语言

    分治法求最大子序列和 使用C语言 一 问题提出 二 算法分析 三 程序设计 四 程序结果显示 一 问题提出 给定一个序列 其中可能有正数也可能有负数 找出其中连续的一个子数列 不允许空序列 使它们的和尽可能大 二 算法分析 对于任意一个序列
  • 算法导论 学习笔记 第四章 递归

    n logba Theta n log b a lga Theta lga 这一章主要是介绍了三种求运行时间的方法 这三种方法都是解决递归问题的 就像分治法这种问题的算法的运行时间 这三种方法分别是替换法 递归树方法 主方法 4 1替换法
  • js分治法入门级教程,二分搜索的解法

    一 分治法定义 在计算机科学中 分治法是一种很重要的算法 字面上的解释是 分而治之 分治法就是把一个复杂的问题分成两个或更多的相同或相似的子问题 再把子问题分成更小的子问题 直到最后子问题可以简单的直接求解 原问题的解即子问题的解的合并 分
  • 最大子数组问题

    最大子数组问题 本文只是做一个记录 更细致的思路请查看算法导论 最大子数组结构体 typedef struct int low high sum SubArray 暴力求解 计算所有的数组区间的和进而得到最大的子数组 算法复杂度为 n 这种
  • ​LeetCode刷题实战88:合并两个有序数组

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 合并两个有序数组 我们先来看题
  • ​LeetCode刷题实战214:最短回文串

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 最短回文串 我们先来看题面 h
  • 写一个个人认为比较详细的adaboost算法

    最近在看机器学习中adaboost adaptive boostint 算法部分的内容 在csdn上面查找一番发现 好像没有讲的特别的详尽的 当然可能是我人品不佳 所以没有找到 为了防止同样的事情发生在其他人的身上 所以就写了这篇博文 尽量
  • NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论 22页2 3 7 描述一个运行时间为O nlogn 的算法 找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解 a 1 3 6 7 9 15 29 def find2sumx nums x nums sort le r
  • 算法导论学习--红黑树详解之删除(含完整红黑树代码)

    前面我们讨论了红黑树的插入的实现 基本思想是分类讨论 然后分情况讨论以后我们发现插入操作调整函数只需要处理三种情况 并不是太复杂 但是删除操作会更复杂一点 因为二叉搜索树的删除操作本身就分成了多种情况 这样在执行删除操作后要处理的情况会更多
  • 算法导论——插入排序——伪代码和Java实现

    第二章第一节 插入排序 我们首先介绍插入排序 相信大部分人都打过扑克牌 许多人喜欢发一张牌就拿一张牌到手上 并且按顺序来放好牌 开始时我们左手为空 牌在桌子上 然后我们每次从桌子上拿走一张牌并将它插入左手中的位置 为了找到一张牌的正确位置
  • 《算法导论》常见算法总结

    前言 本篇文章总结中用到很多其他博客内容 本来想附上原作链接 但很久了未找到 这里关于原创性均来源于原作者 分治法 分治策略的思想 顾名思义 分治是将一个原始问题分解成多个子问题 而子问题的形式和原问题一样 只是规模更小而已 通过子问题的求
  • 算法导论——分治法、归并排序——伪代码和Java实现

    第二章第三节 分治法 我们首先先介绍分治法 分治法的思想 将原问题分解为几个规模较小但类似于原问题的子问题 递归地求解这些子问题 然后在合并这些子问题的解来解决原问题的解 还是拿扑克牌举例子 假设桌上有两堆牌面朝上的牌 牌面朝上 有值 每堆
  • 计数排序--时间复杂度为线性的排序算法

    我们知道基于比较的排序算法的最好的情况的时间复杂度是O nlgn 然而存在一种神奇的排序算法 不是基于比较的 而是空间换时间 使得时间复杂度能够达到线性O n k 这种算法就是本文将要介绍的计数排序 一 适用情况 这个算法在n个输入元素中每
  • 算法导论 练习 2.2

    2 2 1 答案 n theta n 渐进符号的定义会在第三章里明确给出 所以这里就不写证明了 详细证明见第三章习题 好多好多啊 2 2 2 选择排序 数据结构课程基本排序算法之一 代码 SELECTION SORT A n length
  • 红黑树(算法导论版)

    1 定义 1 每个节点是红色或者黑色的 2 根节点是黑色的 3 所有叶子结点 NIL 都是黑色的 4 如果一个节点是红色 则它的两个子节点都是黑色的 5 对每个节点 从该节点到其所有后代叶节点的简单路径上 均包含相同数目的黑色节点 2 性质
  • 【分治算法】-1.金块问题:递归和分治策略

    例14 2 金块问题 有一个老板有一袋金块 每个月将有两名雇员会因其优异的表现分别被奖励一个金块 按规矩 排名第一的雇员将得到袋中最重的金块 排名第二的雇员将得到袋中最轻的金块 根据这种方式 除非有新的金块加入袋中 否则第一名雇员所得到的金
  • 分治法 ( Divide And Conquer ) 详解

    文章目录 引言 分治法的范式 递归式 求解递归式的三种方法 代入法 递归树法 主方法 引言 在这篇 blog 中 我首先会介绍一下分治法的范式 接着给出它的递归式通式 最后我会介绍三种方法 代入法 递归树 和主方法 求解递归式 分治法的范式

随机推荐

  • 微信小程序之摇骰子源代码分享

    通过这个案例你可以知道 按钮事件 切换image图片 陀螺仪事件 与按钮事件逻辑相同 啥者不用说了 直接上代码 https github com lzc alioo weiapp2 备注 图片是网上百度的 不够好 有小伙伴有好图片替换的话欢
  • springboot+mina框架服务端的实现(一) ------ pom依赖、mina配置类、自定义协议以及编解码器的实现

    来吧 一步一步搭建mina服务端 原理往后再说 参考博客 矢落叶 博客 首先利用springboot的插件新建一个maven项目 一 pom xml 所需依赖 首先加入mina核心依赖
  • 【教程】在VSCode中使用码云进行代码管理

    教程 在VSCode中使用码云进行代码管理 前言 本教程核心内容 本文主要是整合了网上教程 从Git安装开始 配置关联本地仓库到码云 最终用上VScode这个流程 非常基础和简单 照着操作就行了 起因 平时常写python脚本 原先用Sub
  • 因果推断总结

    目录 因果关系的三个层级 因果推断的三个假设 因果性的常见谬误 因果推断偏差原因 因果推断的两种流派 因果推断前提假设 因果推断的方法与实操流程 因果关系的三个层级 因果推断是基于统计学方法刻画变量之间的因果关系 因果关系存在三个层级 第一
  • Java堆,方法区,直接内存

    Java的内存区中 为线程共有的有三部分 Java堆 方法区 直接内存 其中方法区中包含运行时常量池 直接内存并不属于Java的常规内存区 1 Java堆是被所有线程共享的一块内存 在启动虚拟机时创建 通常 所有的对象实例及数组都要在堆上分
  • [pytorch报错]ValueError: num_samples should be a positive integer value, but got num_samples=0

    项目场景 在mmeg中运行自定义数据集报错情况 问题描述 运行代码后 mmSeg提示说 2021 12 08 18 39 33 991 mmseg INFO Loaded 0 images 说明模型没有加载数据 数据地址出错 报错信息 Fi
  • 轮胎的魔术公式(Magic Fomula)模型

    本篇结合Adams中的TR rear pac89 tir文件 介绍一下魔术公式的基本知识 使用魔术公式的轮胎模型主要有Pacejka 89 Pacejka 94 MF Tyre MF Swift四种 1 Pacejka 89和 94轮胎模型
  • java常用框架总结

    今天想看看现在常用的框架有哪些 发现网上文章不多决定根据自己的理解写一篇文章 如有错误希望大家包涵 1 java的5大框架 springboot都不说了 网上资料很多 2 缓存工具 Ehcache redis 3 消息队列中间工具 Rabb
  • 层次聚类AgglomerativeClustering()树形图可视化与children_属性解析

    层次聚类函数AgglomerativeClustering 我们主要来讲解层次聚类的可视化画图和层次聚类后返回的children 属性 children 属性的理解需要借助可视化图形 1 层次聚类的可视化画图 1 1步骤 step1 使用
  • Linux中修改jar包中的文件内容

    1 命令行中输入vim jar包路径 2 回车 打开jar包中的文件目录 并定位到要修改的文件位置 3 回车 打开文件内容进行修改 4 修改后 Ctrl wq保存退出上步 再次Ctrl q退出 完成修改
  • 计算机二级页表页框大小,两级页表

    本文是在基本分页存储管理的基础上对分页管理的优化 在上篇文章中说到 操作系统会为每个进程建立一张页表 实现页号和内存块号之间的对应关系 本文从单级页表存在的问题引出两级页表 以及两级页表如何实现地址的变换 1单级页表存在的问题 假设某计算机
  • 两层和三层的讨论

    下面的东西都是转贴的 包括那个声明 都跟我没关系 google搜出来的 在这之前我的确觉得DataSetProvider ClientDataSet和我理解中的三层有点差别 看完这些讨论 我的结论是 DataSetProvider Clie
  • 2023华为OD机试真题-跳格子2JAVA、Python、C++)

    题目描述 小明和朋友玩跳格子游戏 有 n 个连续格子组成的圆圈 每个格子有不同的分数 小朋友可以选择从任意格子起跳 但是不能跳连续的格子 不能回头跳 也不能超过一圈 给定一个代表每个格子得分的非负整数数组 计算能够得到的最高分数 输入描述
  • BFS常见模板题(初学BFS推荐,附例题由浅入深)

    BFS类题目 主要考查对广度搜索的理解 BFS相比于暴力枚举来说效率更高 BFS只要将范围矩阵扫一次即可得出答案 本文通过队列来实现求解 当然也可以用其他方式实现广度搜索 First question 馋嘴羊 BFS思路 可能会比较抽象 建
  • 图论之Dijkstra

    Dijkstra模板 include
  • JavaScript V8 > 牛客OJ在线编程常见输入输出练习场

    C 处理输入输出 牛客OJ在线编程常见输入输出练习场 A A B 1 B A B 2 C A B 3 D A B 4 E A B 5 F A B 6 G A B 7 H 字符串排序 1 I 字符串排序 2 J 字符串排序 3 牛客OJ在线编
  • C语言函数大全-- _w 开头的函数(4)

    w 开头的函数 4 1 wstrtime 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 wstrtime s 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 wsetlocale 3 1 函数说明 3 2 演示示例 3
  • STM32 ADC

    1 什么是ADC ADC指模数转换 模拟信号是指时间幅值均连续的信号 对其采样后得到的信号称之为离散时间信号 若再对其进行量化处理则得到数字信号 请注意对模拟信号采样得到的信号不是数字信号 仅仅是离散时间信号 详情请见数字电子电路 信号与系
  • python稳健性检验_有哪些比较好的做异常值检测的方法?

    最近很多小伙伴都比较关注异常值检测的方法 接下来小编就为大家介绍几种 希望能帮到大家 摘要 本文介绍了异常值检测的常见四种方法 分别为Numeric Outlier Z Score DBSCA以及Isolation Forest 在训练机器
  • 算法导论 第三节 分治法

    分治法 1 分 把一个大问题分成若干个小问题 即原问题的n变小 2 治 递归的解决每一个子问题 然后把这些子问题的解合并成整个大问题的解 归并排序 1 一分为二 2 递归的对每一个子数组进行排序 3 合并 线性的n时间内就可以完成 归并排序