算法的奥秘:常见的六种算法(算法导论笔记2)

算法的奥秘:种类、特性及应用详解(算法导论笔记1)

上期总结算法的种类和大致介绍,这一期主要讲常见的六种算法详解以及演示。

排序算法:

排序算法是一类用于对一组数据元素进行排序的算法。根据不同的排序方式和时间复杂度,有多种排序算法。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。

冒泡排序:通过不断比较相邻元素并交换顺序,使得较大的元素逐渐“浮”到数组的末尾,如同气泡一样。


选择排序:每次从未排序的元素中选择最小(或最大)的元素,放到已排序的末尾。


插入排序:将未排序的元素一个个插入到已排序的数组中,从而逐步形成排序好的数组。


快速排序:通过选择一个基准元素将数组分成两部分,一部分小于基准元素,一部分大于基准元素,然后递归地对这两部分继续进行快速排序。

1ec82163570ece4d502669727e09e859.png

快速排序算法的实现包括两个主要部分:quickSort和partition。quickSort方法用于递归地排序子数组,而partition方法则用于将数组分为两个子数组,并返回基准元素的索引。在partition方法中,我们选择数组的最后一个元素作为基准,然后将小于等于基准的元素移到左边,大于基准的元素移到右边。最后,我们返回基准元素的索引,以便在quickSort方法中进一步分割子数组。在示例用法中,我们创建了一个包含七个整数的数组,并对其进行快速排序。


归并排序:采用分治策略,将数组分成若干个子数组,分别进行排序,最后将排好序的子数组合并成完整的排好序的数组。

查找算法:

查找算法用于在数据结构中查找特定元素。常见的查找算法包括线性查找和二分查找等。

线性查找:从数据结构的一端开始逐个比较每个元素,直到找到目标元素或遍历完整个数据结构。


二分查找:在有序的数据结构中,通过不断缩小查找范围来进行查找。首先确定查找范围的最左端和最右端,然后根据目标元素与中间元素的比较结果来确定下一步查找的方向,不断缩小查找范围直至找到目标元素或确定目标元素不存在为止。

13cfba82e3326bc085f2d1945a1a6ecb.png

二分查找算法是一种高效的查找算法,它要求待查找的数组必须是有序的。该算法的基本思想是将数组分成两个部分,然后根据目标元素与中间元素的比较结果,将查找范围缩小一半。具体来说,我们首先将查找范围设为整个数组,然后通过比较目标元素与中间元素的大小,不断将查找范围缩小,直到找到目标元素或确定目标元素不存在为止。在示例用法中,我们创建了一个包含五个整数的数组,并使用二分查找算法查找目标元素5的位置。如果目标元素存在,则输出其位置;否则输出“目标元素不存在”。

图论算法:


图论算法用于解决图论问题,如最短路径、最小生成树、网络流等。常见的图论算法包括Dijkstra算法、Prim算法、Kruskal算法等。

Dijkstra算法:用于求解单源最短路径问题,给定一个有向图和一个起点,求出从起点到图中所有其他节点的最短路径。


Prim算法:用于求解最小生成树问题,在一个无向加权图中找到一棵包含所有节点且权值和最小的树。


Kruskal算法:用于求解最小生成树问题,通过不断添加边来构建最小生成树,直至所有节点都被覆盖。

fb3bca38ab3c13d224f7fea8ac1cc546.png

04a40e5306d16acfc84231fe6c5d34f8.png

动态规划算法:

动态规划算法用于解决最优化问题,通过将问题分解为若干个子问题,并记录子问题的解,从而避免重复计算,提高求解效率。常见的动态规划算法包括背包问题、最大子段和问题等。

背包问题:给定一组物品,每种物品都有自己的重量和价值,背包的总容量有限。求解如何选择物品放入背包使得背包内的总价值最大。
最大子段和问题:给定一个整数数组,求解连续的子数组使得其和最大。

分治算法:

分治算法将问题分解为若干个子问题,分别解决这些子问题,然后将子问题的解合并以得到原问题的解。常见的分治算法包括快速排序、归并排序等。

快速排序:通过选择一个基准元素将数组分成两部分,一部分小于基准元素,一部分大于基准元素,然后递归地对这两部分继续进行快速排序。最后将排好序的子数组合并成完整的排好序的数组。


归并排序:采用分治策略,将数组分成若干个子数组

贪心算法:

贪心算法是一种解决问题的策略,它的思想是每一步都选择当前情况最好或最优(即最有利)的选择,希望通过这样的选择来得到全局最优解。这种算法在每一步中都只考虑当前情况下最好或最优的选择,而不会考虑这样的选择会对后续的结果产生什么样的影响。

举个例子来说,比如找零问题:假设我们需要在钱币面额为100元、50元、20元、10元、5元和1元的钱柜中找零,贪心算法会首先选择100元的钱币,然后是50元,以此类推,直到我们找到足够的零钱。这种策略虽然不一定能找到最优解(即使用最少数量的钱币),但通常能找到一个接近最优解的结果。

贪心算法的优点在于它每一步的操作都非常简单明了,也容易实现。同时,由于它每一步都选择最优解,所以它的时间复杂度通常比较低。但是,贪心算法并不适用于所有问题,有些问题使用贪心算法可能会得到局部最优解,但不一定能得到全局最优解。因此,当我们使用贪心算法时,需要先判断它是否适用于当前的问题。

73060bcb60c7a5776538d4bdf25c3ea5.png

这个算法首先将硬币按照面值从大到小排序,然后从面值最大的硬币开始找零,尽可能多地使用这种硬币,直到找零的金额无法再使用这种硬币为止。然后,算法使用下一种面值较大的硬币,重复上述过程,直到找零的金额减到0为止。在实现中,我们将硬币按照面值从大到小排序,然后依次枚举每种硬币,计算使用这种硬币能够找零多少金额,然后将这种硬币加入结果列表中。重复这个过程,直到找零的金额减到0为止。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解 Pinia:现代 Vue 应用的状态管理利器

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

DMX512协议及对接口电路的分析

1、DMX512协议简介 DMX 是Digital MultipleX 的缩写,意为多路数字传输(具有512条信息的数字多路复用”)。DMX512控制协议是美国舞台灯光协会(usITT)于1990年发布的灯光控制器与灯具设备进行数据传输的工业标准,全称是USITTDMX512(1990); DMX512 在其物理…

Springmvc原理解析

1. DispatcherServlet springmvc的核心控制器,负责截获所有的请求,当截获请求后委托给HandlerMapping进行请求映射的解析工作,目的是找到哪一个Controller的方法可以处理该请求,找到后再交由给HandlerAdaptor去负责调用并返回Mod…

第13周 预习、实验与作业:Java网络编程

目录 1 课前问题列表 1.编写一个网络程序,为了与其他网络程序通信,至少要知道对方的什么信息? 2.TCP与UDP协议有什么不同的呢?什么时候该选择哪种协议?HTTP使用的是TCP还是UDP?不重要的短信息传送之类的功能…

Redis key的类型以及命令

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

java基于springboot公益帮学网站 新闻发布系统的设计与实现vue

以Java为开发平台,综合利用Java Web开发技术、数据库技术等,开发出公益帮学网站。用户使用版块:可以选择注册并登录,可以浏览信息、可以网上互动、发布文章、内容推荐等。后台管理员管理版块:以管理员身份登录网站后台…

C语言——打印出所有的“水仙花数”

所谓水仙花数,是指一个3位数,其各位数字立方和等于该数本身。水仙花数是指一个三位数&#xff0c;它的每个位上的数字的立方和等于它本身。例如&#xff0c;153是一个水仙花数&#xff0c;因为1^3 5^3 3^3 153。 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>…

VUE语法-$refs和ref属性的使用

1、$refs和ref属性的使用 1、$refs:一个包含 DOM 元素和组件实例的对象&#xff0c;通过模板引用注册。 2、ref实际上获取元素的DOM节点 3、如果需要在Vue中操作DOM我们可以通过ref和$refs这两个来实现 总结:$refs可以获取被ref属性修饰的元素的相关信息。 1.1、$refs和re…

Vue3-pnpm包管理器创建项目

一些优势&#xff1a;比同类工具快2倍左右、节省磁盘空间 官网&#xff1a;pnpm - 速度快、节省磁盘空间的软件包管理器 | pnpm中文文档 | pnpm中文网 npm升级到yarn再升级到pnpm&#xff08;速度更快&#xff09; 安装方式&#xff1a;npm install -g pnpm 创建项目&#…

计算虚拟化之CPU——qemu解析

解析 qemu 的命令行&#xff0c;qemu 的命令行解析&#xff0c;就是下面这样一长串。 qemu_add_opts(&qemu_drive_opts);qemu_add_opts(&qemu_chardev_opts);qemu_add_opts(&qemu_device_opts);qemu_add_opts(&qemu_netdev_opts);qemu_add_opts(&qemu_nic_…

数据结构(超详细讲解!!)第二十五节 树与森林

1.树的存储结构 和线性表一样&#xff0c;树可以用顺序和链式两种存储结构。 树的顺序存储结构适合树中结点比较“满”的情况。根据树的非线性结构特点&#xff0c;常用链式存储方式来表示树。树常用的存储方法有&#xff1a;双亲表示法、孩子表示法和孩子兄弟表…

【Dockerfile】将自己的项目构建成镜像部署运行

目录 1.Dockerfile 2.镜像结构 3.Dockerfile语法 4.构建Java项目 5.基于Java8构建项目 1.Dockerfile 常见的镜像在DockerHub就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了解镜像的结构才行。 2.镜像结构 镜…

蓝桥杯算法双周赛心得——迷宫逃脱(记忆化搜索)

大家好&#xff0c;我是晴天学长&#xff0c;非常经典实用的记忆化搜索题&#xff0c;当然也可以用dp做&#xff0c;我也会发dp的题解&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .迷宫逃脱 迷官逃脱…

Mac | Vmware Fusion | 分辨率自动还原问题解决

1. 问题 Mac的Vmware Fusion在使用Windows10虚拟机时&#xff0c;默认显示器配置如下&#xff1a; 开机进入系统并变更默认分辨率后&#xff0c;只要被 ⌘Tab 切换分辨率就会还原到默认&#xff0c;非常影响体验。 2. 解决方式 调整 设置 -> 显示器 -> 虚拟机分辨率…

Authing CEO 谢扬来信 |我的原则

从忙碌的工作中短暂抽身&#xff0c;有很多感想&#xff0c;不吐不快&#xff0c;借此机会&#xff0c;倾我所有&#xff0c;诉我原则。 原则一&#xff1a;坚强信念&#xff0c;坚定意志 商人大多「无利不起早」&#xff0c;而创业者的反馈周期比商人长非常非常多。 相比「商品…

【Linux进阶之路】进程间通信

文章目录 一、原理二、方式1.管道1.1匿名管道1.1.1通信原理1.1.2接口使用 1.2命名管道 2.共享内存2.1原理2.2接口使用 3.消息队列原理 4.信号量引入原理 总结 一、原理 进程间的通信是什么&#xff1f;解释&#xff1a; 简单理解就是&#xff0c;不同进程之间进行数据的输入输出…

2023 hnust 湖南科技大学 信息安全管理课程 期中考试 复习资料

前言 ※老师没画重点的补充内容★往年试卷中多次出现或老师提过的&#xff0c;很可能考该笔记是奔着及格线去的&#xff0c;不是奔着90由于没有听过课&#xff0c;部分知识点不一定全&#xff0c;答案不一定完全正确最新版请转至Github 题型 试卷有很多题是原题&#xff0c;分…

二十一、数组(6)

本章概要 数组排序Arrays.sort的使用并行排序binarySearch二分查找parallelPrefix并行前缀 数组排序 根据对象的实际类型执行比较排序。一种方法是为不同的类型编写对应的排序方法&#xff0c;但是这样的代码不能复用。 编程设计的一个主要目标是“将易变的元素与稳定的元素…

一文读懂现代化数据中心DCIM系统容量管理的几个维度

数据中心是现代科技领域不可或缺的基础设施&#xff0c;其承载着大量的计算、存储和网络资源&#xff0c;是众多行业业务数字化的起点&#xff0c;更是衡量企业数字化能力的关键因素。数据中心DCIM&#xff08;Data Center Infrastructure management&#xff09;&#xff0c;即…

linaro交叉编译工具链下载与使用笔记

笔记 文章目录 笔记确定目标 &#xff08;aarch64&#xff09;选择版本&#xff08;7.5&#xff09;选择目标&#xff08;aarch64-linux-gnu&#xff09;下载地址工具链&#xff08;gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz&#xff09;编译测试 &#xff08…