【数据结构与算法】程序员常用10种算法(分治算法)

news2024/11/15 2:02:11

一、分治算法介绍

在计算机科学中,分治法就是运用分治思想的一种很重要的算法。

分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治法是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等等。

 

 将父问题分解为子问题同等方式求解,通常以递归的方式实现(当然也有非递归的实现方式)。分治算法的描述从字面上也很容易理解,分、治其实还有个合并的过程

二、分治算法的基本步骤

  • 分解:将原问题分解为个规模较小,相独立,与原问题形式同的子问题
  • 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
  • 合并:将各个子问题的解合并为原问题的解

一般分治算法在正文中分解为两个即以上的递归调用,并且子类问题一般是不想交的(互不影响)。当求解一个问题规模很大很难直接求解,但是规模较小的时候问题很容易求解并且这个问题并且问题满足分治算法的适用条件,那么就可以使用分治算法。

分治算法和递归有什么关系?其实分治重要的是一种思想,注重的是问题分、治、合并的过程。而递归是一种方式(工具),这种方式通过方法自己调用自己形成一个来回的过程,而分治可能就是利用了多次这样的来回过程。

三、分治算法经典问题-汉诺塔的传说

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64片黄金圆盘。大天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。假如每秒钟一次,共需多长时间呢? 移完这些金片需要 5845.54 亿年以上,太阳系的预期寿命据说也就是数百亿年。真的过了 5845.54亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

 

  • 汉诺塔游戏的思路分析:

        1、如果是有一个盘,A->C
        如果我们有 n>=2 情况,我们总是可以看是两个盘:最下边的盘和上面的盘
        2、先把最上面的盘A->B
        3、把最下边的盘 A->C
        4、把B塔的所有盘 从B->C

  • 汉诺塔游戏的代码实现:
package com.biyu.demo;

public class Hanoitower {

    public static void main(String[] args) {
        hanoiTower(10, 'A', 'B', 'C');
    }

    /**
     * 移动方法
     * @param num
     * @param a
     * @param b
     * @param c
     */
    public static void hanoiTower(int num, char a, char b, char c) {
        //如果只有一个盘
        if (num == 1) {
            System.out.println("第1个盘从 " + a + "->" + c);
        } else {
            //如果我们有 n >= 2 情况,我们总是可以看做是两个盘 1.最下边的一个盘 2. 上面的所有盘
            //1. 先把 最上面的所有盘 A->B, 移动过程会使用到 c
            hanoiTower(num - 1, a, c, b);
            //2. 把最下边的盘 A->C
            System.out.println("第" + num + "个盘从 " + a + "->" + c);
            //3. 把B塔的所有盘 从 B->C , 移动过程使用到 a塔  
            hanoiTower(num - 1, b, a, c);
        }
    }
}

 

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

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

相关文章

【DNS】域名解析服务

文章目录 1.DNS1.1 DNS定义1.2 DNS系统作用1.3 DNS解析过程 1.DNS 1.1 DNS定义 DNS是"域名系统"的英文缩写。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 DNS服务使用TCP和UDP的53端口,TCP的53端口用于连…

Java - 内部类

1、本地内部类 2、实例内部类 3、静态内部类 4、匿名内部类 首先,我要在这声明一下,内部类也是类,不管它是属于何种类型。 只要是类,就会有类的特性:继承 / 被继承,实现接口,套娃【内部类再套一…

JWT 鉴权插件上线!让你的 API 更安全!

API鉴权是保证API安全性和可用性的一项重要措施。通过API鉴权,系统可以对用户或者应用进行有效的身份认证和权限管理。 除了我们之前更新的 Basic Auth 鉴权插件,这次给大家带来 JWT 鉴权插件。 JSON Web Token是一种开放标准,可以让服务器生…

数字孪生智慧路桥怎么实现?

近年来,道路桥梁安全事故频发,直接影响到了行车人员的人身安全,并且对整个公路桥梁的稳定性产生了不良影响。因此对道路桥梁运行状态的实时监测、及时进行运行状态的预警、实现巡检运维智慧化,已成为桥梁道路管理重点关注的方面。…

PostgreSQL与MySQL优劣势比较浅谈

目录 1 简介2 postgresql比mysql强大在那些方面3 PostgreSQL 为什么在国内没有MySQL流行4 postgresql比mysql一些主要区别5 postgresql比mysql特征比较5.1 MariaDB的主要特点5.2 PostgreSQL的主要特点 6 总结 1 简介 因为公司使用PostgreSQL很长时间了,忙于功能开发…

计算机视觉-角点检测

角点检测 1.分别实现Harris角点检测与SIFT特征提取,对比两者的区别1.1代码实现1.2两者区别 2.利用SIFT算法实现两幅相近图像的特征匹配2.1代码实现 3.实现匹配地理标记图像3.1代码实现 4.实验注意事项4.1实验需要安装的库和应用4.2报错内容 5.小结 1.分别实现Harris…

cdr文件怎么转化成ai文件 CDR文件转AI文件大小会变化吗

cdr与AI软件都可以用于制作矢量图形。基于不同的打印与使用需求,可能需要将cdr文件保存为ai文件使用。那么,cdr文件怎么转化成ai文件,CDR文件转AI文件大小会变化吗?下面让我们来详细解读一下吧。 一、cdr文件怎么转化成ai文件 c…

实验7 回归问题

1. 实验目的 ①掌握一元线性回归模型的实现方法; ②掌握多元线性回归模型的实现方法; ③掌握三维数据可视化方法。 2. 实验内容 ①使用TensorFlow建立一元线性回归模型,使用商品房销售数据训练模型,并使用训练好的模型预测房价…

【C++】17.map和set的模拟实现

1.红黑树中的迭代器 operator是关键 迭代需要走中序 如何走中序? _node从左子树的最左结点开始遍历走中序 分两类情况: 如果右树不为空 那么中序的下一个就是右子树的最左结点 如果右树为空 那么表示_node所在的子树已经完成 在一个结点的祖先去找 沿着路径往上孩子是它的…

【Linux】网络基础(网络层与链路层)

网络层与链路层典型协议网络层IP 地址地址管理网络号的划分(五种)特殊的网络以及IP地址路由选择链路层MAC 地址ARP 协议MTU 最大传输单元其他典型协议:ICMP、DNS 、NAT技术ICMP协议DNS 协议NAT & NAPT 技术代理网络层 功能:负…

算法设计与分析阶段考总结

前言:基本是为了我自己看的一些我容易忘记的东西,为考试作准备把 第一章 算法中的基本概念 程序设计数据结构算法 算法特性 1.有穷性 2.确定性 3.可行性 4.输出 5.输入 算法复杂性分析 算法复杂性依赖于:问题规模N,输入I&#xff…

TCP 的可靠传输

目录 可靠传输有啥用确认应答超时重传总结 可靠传输有啥用 我们知道相比于 UDP, TCP 的传输是可靠的, 啥意思呢? 就是 UDP 发送的数据, 它自己不知道发送的数据对方是否接收到. 而 TCP 发送的数据, 它知道对方是否接收到, 也就是说对方会给个应答. 假设一个场景 : 甲要付款给…

全网最详细,Jmeter性能测试-性能基础详解,接口关联与编写Java脚本(三)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 接口关联 接口关联…

Vector - CAPL - CAN x 总线信息获取(续1)

继续.... 目录 OverLoadFrameCount -- 过载帧数量 代码示例 OverLoadFrameRate -- 过载帧速率 代码示例 StandardFrameCount -- 标准帧数量 代码示例 StandardFrameRate -- 标准帧速率 代码示例 StandardRemoteFrameCount -- 标准远程帧数量 代码示例 StandardRemote…

Java注解编译期处理AbstractProcessor详解

文章目录概述注解处理器注解处理流程AbstractProcessorgetSupportedOptions()getSupportedAnnotationTypesgetSupportedSourceVersioninit初始化process 处理方法如何注册注解处理器如何调试编译期代码Maven相关配置(指定生效的Processor)注意事项自定义注解处理器范例范例一&a…

多线程小知识

多线程 多线程环境使用哈希表HashMapHashtableConcurrentHashMap 死锁死锁是什么两者之间的死锁多人之间的死锁 死锁产生的四个必要条件:互斥使用不可抢占请求和保持循环等待 不同的锁ReentrantLockSynchronized和ReentrantLock之间的区别:具体选择Synchronized加锁工作过程偏向…

using namespace std 是什么意思——C++命名空间

目录 namespace命名空间局部域和全局域namespace展开命名空间指定命名空间 命名空间的嵌套不同文件中的同名命名空间 using namespace std 是什么意思 我们先看一段C代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 0;int main() {printf(&quo…

6.2 统计量与抽样分布

学习目标&#xff1a; 我的理解: 统计量是从一个样本中计算得到的数值&#xff0c;用于描述样本的某种特征或性质。统计量可以用来推断总体的特征或性质&#xff0c;因为样本是总体的一部分。 通常&#xff0c;统计量是通过对样本中的数据进行计算得到的&#xff0c;例如平均…

3年轻人20万开店日营业额79.2元,年轻人开店还能赚到钱吗?

最近&#xff0c;河南郑州的蔡先生和2个朋友合伙开一家汉堡店&#xff0c;生意很惨淡&#xff0c;日营业额79.2元。 蔡先生表示&#xff0c;他们开店失败的最大原因就是没有做好前期准备工作&#xff0c;产品没有吸引人的特色&#xff0c;导致正式营业后吸引不到客户。 蔡先生用…

Python 实现海康机器人工业相机 MV-CU060-10GM 的实时显示视频流及拍照功能

一、背景介绍 1、最近项目中需要给客户对接海康机器人工业相机 MV-CU060-10GM&#xff1b; 2、客户要求通过部署的管理平台&#xff0c;可以在页面上实现如下功能&#xff1a; 1&#xff09;相机视频流开始预览&#xff1b; 2&#xff09;相机视频流停止预览&#xff1b; 3&am…