什么是分治算法?

news2024/11/22 12:16:00

分治算法(divide and conquer algorithm)是指把大问题分割成多个小问 题,然后把每个小问题分割成多个更小的问题,直到问题的规模小到能够 轻易解决。这种算法很适合用递归实现,因为把问题分割成多个与自身相 似的小问题正对应递归情况,当小问题已经达到了能够轻易解决的规模时, 遇到基本情况。分治算法所采用的解题策略有一项优势——并行地处理小 问题,这允许多个CPU (中央处理器)或多台计算机同时处理它们。

详细讲解见《递归算法与项目实战》第5章。(摘录部分内容)

第5章要讲解一些适合采用递归实现的分治算法,如二分搜索、快速排序 以及归并排序算法等。另外,我们还要重新考虑怎样对数组中的各整数求和,这次你会看到如何用 分治策略解决该问题。最后,第5章会介绍卡拉楚巴乘法算法,该算法为实现计算机硬件的快速乘法打下了基础。

1 二分搜索

假设书架上面有100本书。你并不记得每一本具体放在什么地方,但你知道这些书已经按 照书名字母顺序排列好。于是,在寻找 Zebras: The Complete Guide 这样的书时,你肯定不会从 头开始找,因为书架一开始摆放的应该是Aaron Burr Biography那种首字母靠前的书,你应该 在书架末尾的那些书中寻找才对。这本谈zebras的书未必是书架上的最后一本,因为它后面可 能还有名称以 zephyrs、zoos 或 zygotes 等词开头的书,尽管如此,但是它应该离书架末尾不太 远。我们可以把这样两个事实当作自己试探的基础(或者当作推理的线索),从而决定从末尾而 从不是开头寻找这本书。第一,书架上的书是按书名字母顺序排列的;第二,我们要找的这本 书的首字母为Z, 这样的书应该在书架的后一半,而不是前一半。

二分搜索 (binary search) 又称为二分查找,是一种通过反复将有序列表分成大致相等的 两半而从中搜索待查目标的方法。最公允的二分方式就是平分,也就是先查书架正中的那本 书,如果它不是你要找的书,那么接下来判断你要找的书是位于书架的前一半,还是位于书 架的后一半。

然后,你可以继续执行这个将有序列表分成大致相等的两半的操作,如图5-1 所示。也 就是说,你在刚才确定的那一半中,首先查看中间那本书,如果它不是你要找的书,那么接 下来判断你要找的书是在这个范围的前一半(也就是左侧),还是在这个范围的后一半(也就 是右侧),这样确定的范围大约相当于书架所有书数量的1/4。反复执行这一操作,直至找到你要找的书,如果你已经把这个范围缩小到0,但还没有找到自己要找的书,就可以宣布,这 本书不在书架上面。

图5-1 用二分搜索法反复将有序列表分成相等的两半,以便在其中寻找目标元素

这种搜索策略能够有效推广到更大规模的数据,因为即使图书的总量翻倍,整个搜索过 程也只会增加一步。假如用线性的(也就是一本一本的)搜索方式在摆放着50本书的书架上 寻找某一本书,那么最多有可能需要50步,在摆放着100本书的书架上寻找某一本书,最多 有可能需要100步。与之相比,用二分搜索法在摆放着50本书的书架上寻找某一本书,最多 只需要6步,在摆放着100本书的书架上寻找某一本书,最多只需要7步。

现在,我们把实现递归式的二分搜索算法时所要考虑的3个问题回答一遍。

  • 什么是基本情况? 待搜索的范围长度为0的情况,或该范围中间的那个元素正好是待查 元素的情况。
  • 在递归函数调用中应该传入什么样的参数? 传入接下来要搜索的这个范围的起止下标。
  • 在递归函数调用中传入的参数是如何向基本情况靠近的?由于每次递归调用都会把搜 索范围变成原来的一半,因此最后该范围内总会出现只有一个元素的情况。如果这个元 素是我们要找的元素,那么二分搜索算法就遇到了其中一种基本情况,它会返回该元素 的位置;如果不是,那么下一次递归肯定会让待查范围的长度变为0,从而使二分搜索 算法遇到另一种基本情况,它会返回None, 以表示找不到该元素。

下面的 binarySearch.py程序中有一个binarySearch() 函数,它能够在haystack 参数表示的有序列表中搜索needle 参数表示的值。


关于《递归算法与项目实战》这本书

本书是写给那些害怕递归算法或对递归算法感兴趣的人的。对于程序员新手或计算机科学 专业大一的学生而言,递归好像是魔法。许多递归课程很难懂,这让许多人非常沮丧,甚至望 而生畏。对于这些读者,我希望本书直白的解读和大量的示例能让递归更容易理解。

要看懂本书,你必须会编写基本的 Python程序或 JavaScript 程序,因为正文中的示例代码 是用这两种语言编写的。本书中的代码去除了多余的部分,只保留了精华。你只要知道怎么创 建并调用函数,而且明白全局变量与局部变量有什么区别,就能够看懂书中的所有示例。

本书有14章。

第1部分包含第1~9章。

第1章解释什么叫递归,并说明编程语言中函数的实现方式与函数调用方式为什么会很自 然地形成递归。该章还会说明递归为什么不像想象中那样神奇。

第2章深入讨论递归与迭代的区别及相似之处。

第3章讲解经典的递归算法。

第4章讨论一种很适合用递归解决的问题,也就是树状结构的遍历问题,例如,当走迷宫 或浏览目录时,有可能需要做这样的遍历。

第5章讨论如何用递归把大问题拆分成多个小问题,并讲解常见的分治算法

第6章讨论涉及排列与组合的递归算法,以及适合用这些算法解决的常见编程问题。

第7章讲解在用递归解决实际问题时提高编码效率的一些简单的技巧——记忆化与动态 规划。

第8章讲解尾调用优化及其原理。

第9章展示一些可以用递归算法绘制的图形。在该章中,我们使用 turtle 模块生成这些 图形。

第2部分包含第10~14章。

第10章介绍如何实现文件查找器项目,用于根据用户提供的搜索参数搜索计算机中的文件。

第11章讨论如何实现迷宫生成器项目——用递归回溯算法自动生成任意大小的迷宫。

第12章讲述如何实现滑块拼图项目,用于解决滑块拼图(这种拼图通常由15 个可以横竖 滑动的方块构成)问题。

第13章讨论如何实现分形图案制作器项目,生成指定的分形图案。

第14 章讨论如何实现画中画制作器项目:用 Pillow 这个图像操纵模块,生成递归式的画 中画效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1178834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java —— 类和对象(一)

目录 1. 面向对象的初步认知 1.1 什么是面向对象 1.2 面向对象与面向过程 2. 类定义和使用 2.1 认识类 2.2 类的定义格式 3. 类的实例化(如何产生对象) 3.1 什么是实例化 3.2 访问对象的成员 3.3 类和对象的说明 4. this引用 4.1 为什么要有this引用 4.2 什么是this引用 4.3 th…

无线发射芯片解决方案在智能家居中的应用

随着物联网的发展,智能家居已经成为一个热门话题。智能家居利用无线技术来实现设备之间的互联互通,提供更智能、更便利的生活体验。无线发射芯片解决方案在智能家居中扮演着关键的角色,它们为智能家居设备之间的通信提供了稳定、高效的连接&a…

stm32f103+HC-SR04+ssd1306实现超声波测距

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言HC…

【江协科技-用0.96寸OLED播放知名艺人打篮球视频】

Python进行视频图像处理,通过串口发送给stm32,stm32接收数据,刷新OLED进行显示。 步骤: 1.按照接线图连接好硬件 2.把Keil工程的代码下载到STM32中 3.运行Python代码,通过串口把处理后的数据发送给STM32进行显示 …

Spark 新特性+核心回顾

Spark 新特性核心 本文来自 B站 黑马程序员 - Spark教程 :原地址 1. 掌握Spark的Shuffle流程 1.1 Spark Shuffle Map和Reduce 在Shuffle过程中,提供数据的称之为Map端(Shuffle Write)接收数据的称之为Reduce端(Sh…

Leetcode刷题详解——组合

1. 题目链接:77. 组合 2. 题目描述: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[…

vue3拖拽排序——vuedraggable

文章目录 安装代码效果拖拽前拖拽时拖拽后 vue3 的拖拽排序博主用的是 vuedraggable 安装 安装 npm i vuedraggable4.1.0 --save 引用 import Draggable from vuedraggable;代码 html <van-checkbox-group v-model"dataMap.newsActionChecked"><van-cell…

LazyVim: 将 Neovim 升级为完整 IDE | 开源日报 No.67

curl/curl Stars: 31.5k License: NOASSERTION Curl 是一个命令行工具&#xff0c;用于通过 URL 语法传输数据。 核心优势和关键特点包括&#xff1a; 可在命令行中方便地进行数据传输支持多种协议 (HTTP、FTP 等)提供丰富的选项和参数来满足不同需求 kubernetes/ingress-n…

项目中登录验证码怎么做才合理

唠嗑部分 今天我们来聊聊项目实战中登录验证码如何做比较合理&#xff0c;首先我们聊以下几个问题 1、登录时验证码校验是否必要&#xff1f; 答案当然是很有必要的&#xff0c;因为用户登录行为会直接影响数据库&#xff0c;如果没有某些防范措施&#xff0c;有恶意用户暴力…

NOIP2023模拟12联测33 A. 构造

NOIP2023模拟12联测33 A. 构造 文章目录 NOIP2023模拟12联测33 A. 构造题目大意思路code 题目大意 构造题 思路 想一种构造方法&#xff0c;使得 y y y 能够凑成尽可能多的答案 第一行 x y r y ⋯ r xyry \cdots r xyry⋯r 第二行 r y x y ⋯ x ryxy \cdots x ryxy⋯x …

基于SSM的出租车管理系统

基于SSM的出租车管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 驾驶员界面 摘要 基于SSM&#xff08;Spring、Spring MVC、My…

软考 -- 计算机学习(3)

文章目录 一、软件测试基础1.1 基本概念1.2 软件测试模型1.3 软件测试的分类 二、基于规格说明的测试技术(黑盒)2.1 重要的测试方法1. 等价类划分法2. 边界值法3. 判定表法4. 因果图法 2.2 其他测试方法 三、基于结构的测试技术(白盒)3.1 静态测试3.2 动态测试 一、软件测试基础…

Vue Vuex模块化编码

正常写vuex的index的时候如果数据太多很麻烦&#xff0c;如有的模块是管理用户信息或修改课程等这两个是不同一个种类的&#xff0c;如果代码太多会造成混乱&#xff0c;这时候可以使用模块化管理 原始写法 如果功能模块太多很乱 import Vue from vue import Vuex from vuex …

nodejs卸载和安装教程

一、卸载 1、Win菜单中找到Node.js的卸载程序&#xff0c;运行卸载程序。 3.选择 OK&#xff0c;等待卸载。 4. 删除C:\Users\用户名\AppData\Roaming目录下的npm和npm-cache&#xff1b;删除C:\Users\123\AppData\Local\目录下的npm-cache。 二、安装 傻瓜式安装&#xf…

socket开发步骤及相关API介绍

socket服务器和客户端的开发步骤 TCP服务端&#xff1a; 创建套接字socket为套接字添加信息&#xff08;IP地址和端口号&#xff09;bind监听网络连接listen监听到由客户端接入&#xff0c;接受一个连接accept数据交互read、write关闭套接字&#xff0c;断开连接close TCP客户…

JAVA二叉搜索树(专门用来查找)

目录 二叉搜索树又叫二叉排序树&#xff0c;它具有以下特征 二次搜索树的效率 模拟最简二叉搜索树代码 代码片段分析 查找二叉搜索树数据&#xff1a; 如果我们用递归的方法查找数据有什么不一样? 插入数据 删除数据(难点) 二叉搜索树又叫二叉排序树&#xff0c;它具有以下特征…

python之pyQt5实例:几何绘图界面

使用PyQt5设计一个界面&#xff0c;其中点击不同的按钮可以在画布上画出点、直线、圆和样条曲线 from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton,QHBoxLayout,QVBoxLayout,QWidget,QLabel from PyQt5.QtGui import QPainter, QPen, QColor from PyQt5.Q…

nssm将exe应用封装成windows服务

一、简介 NSSM&#xff08;Non-Sucking Service Manager&#xff09;是一个用于在Windows操作系统上管理和运行应用程序作为服务的工具。它提供了一种简单的方法来将任意可执行文件转换为Windows服务&#xff0c;并提供了一些额外的功能和配置选项。 优点&#xff1a; 简单易…

【遍历二叉树算法描述】

文章目录 遍历二叉树算法描述先序遍历二叉树的操作定义中序遍历二叉树的操作定义后序遍历二叉树的操作定义 遍历二叉树算法描述 1.遍历定义&#xff1a;顺着某一条搜索路径寻访二叉树中的结点&#xff0c;使得每一个结点均被访问一次&#xff0c;而且仅访问一次&#xff08;又…

【算法-数组3】螺旋数组(一入循环深似海啊!)

今天&#xff0c;带来数组相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 螺旋数组 1. 思路 这道题主要是模拟转圈过程&#xff0c;但是要处理的边界条件比较多&#xff0c;常见的问题就是每条边的处理都有自己的逻辑&#xff0c;那这就很难。如果不…