算法的奥秘:常见的六种算法(算法导论笔记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.hqwc.cn/news/208532.html

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

相关文章

【PHP】PHP生成全年日历

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

〖大前端 - 基础入门三大核心之JS篇㊶〗- DOM事件传播和事件监听方法addEventListener()

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

【kubernetes】k8s架构之节点

文章目录 1、集群架构示意图2、概述3、管理3.1 节点名称唯一性3.2 节点自注册3.3 手动节点管理 4、节点状态4.1 地址(Addresses)4.2 状况(Condition)4.3 容量(Capacity)与可分配(Allocatable&am…

【Linux】进程间通信——进程间通信的介绍和分类、管道、匿名管道、命名管道、匿名管道与命名管道的区别

文章目录 进程间通信1.进程间通信的介绍1.1目的和发展 2.进程间通信分类3.管道3.1匿名管道3.1.1匿名管道的原理(文件角度)3.1.2匿名管道的原理(内核角度)3.1.3管道读写规则3.1.4管道特点 3.2命名管道3.2.1创建命名管道3.2.2命名管…

redis的性能管理及集群架构(主从复制、哨兵模式)

一、redis的性能管理 1、内存指标info memory 内存指标(重要) used_memory:853736 数据占用的内存 used_memory_rss:10551296 redis向操作系统申请的内存 used_memory_peak:853736 redis使用内存的峰值 注:单位:字节 系…

如何使用ArcGIS Pro进行坐标转换

不同来源的数据坐标系可能是不同的,为了统一使用这些数据就需要进行坐标转换,ArcGIS Pro作为专业的GIS软件,坐标转换功能肯定也是包含的,这里为大家介绍一下ArcGIS Pro如何进行坐标转换,希望能对你有所帮助。 数据来源…

2023-11-22 LeetCode每日一题(网格中的最小路径代价)

2023-11-22每日一题 一、题目编号 2304. 网格中的最小路径代价二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中,从一个…

Python中控制台如何展示进度条——tqdm库使用

在 Python 中可以使用特定的库来创建控制台进度条,其中 tqdm 是一个常用的选择,它能够方便地显示进度条并跟踪迭代的进度。你可以通过 pip 安装 tqdm 库: pip install tqdm包装迭代器: 使用 tqdm 来包装你的迭代器,比…

Tomcat实现WebSocket即时通讯 Java实现WebSocket的两种方式

HTTP协议是“请求-响应”模式,浏览器必须先发请求给服务器,服务器才会响应该请求。即服务器不会主动发送数据给浏览器。 实时性要求高的应用,如在线游戏、股票实时报价和在线协同编辑等,浏览器需实时显示服务器的最新数据&#x…

HQL刷题 50道

HQL刷题 50道 尚硅谷HQL刷题网站 答案 1.查询累积销量排名第二的商品 select sku_id from (select sku_id, dense_rank() over (order by total desc) rnfrom (select sku_id, sum(sku_num) totalfrom order_detailgroup by sku_id) t1) t2 where rn 2;2.查询至少连续三天下…

排序算法--快速排序

实现逻辑 ① 从数列中挑出一个元素,称为 “基准”(pivot), ② 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这…

「Verilog学习笔记」含有无关项的序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1ns module sequence_detect(input clk,input rst_n,input a,output reg match);reg [8:0] a_tem ; always (posedge clk or negedge rst_n) begin if (~rs…