这8种算法——程序员必会

news2024/12/29 8:15:02

一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓!”算法吧~

算法一:快速排序法

快速排序法是对冒泡排序的一种改进,是通过一趟排序将要排序的数据,分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后在按此方法,对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

 对于快速排序算法来说,实际上大量的时间都消耗在了分区上面,因此一个好的分区实现是非常重要的,尤其当要分区的所有的元素值都相等时,就会陷入一种最坏的情况,也即反复的交换相同的元素并返回最差的中轴值。

算法二:堆排序算法

堆排序算法是指利用这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或大于)它的父节点。堆积排序的平均时间复杂度为O(nlogn)。

        算法步骤:

1.创建一个堆H[0——n-1]

2.把堆首(最大值)和堆尾互换

3.把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应的位置

4.重复步骤2,直到堆的尺寸为1

算法三:归并排序

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

       算法步骤:

 1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

 2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

 3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

 4. 重复步骤3直到某一指针超出序列尾

  5. 将另一序列剩下的所有元素直接复制到合并序列尾

算法四:二分查找算法

二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素则搜索过程结束;如果某一特定元素大于或小于中间元素,则数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半,折半搜索每次吧搜索区域减少一半,时间复杂度为O(logn)。

 算法五:BFPRT(线性查找算法)

BFPRT算法解决的问题十分经典,即从某 n 个各元素的序列中选出第 k 大(第 k 小)的元素,通过巧妙分析,BFPRT可以保证在最坏的情况下仍为线性时间复杂度。

该算法的思想与快速排序相似,为了使得在最坏的情况下,依然能达到O(n)的时间复杂度,算法作者做了精妙的处理。

算法六:深度优先搜索(DFS)

深度优先搜索算法(Depth First Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。DFS属于盲目搜索。

深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。
   深度优先遍历图算法步骤:
1. 访问顶点v

2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问

3. 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止

算法七:BFS 广度优先搜索算法

广度优先搜索算法(Breadth First Search),是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树 (图) 的宽度遍历树 (图) 的节点。如果所有节点均被访问,则算法中止。BFS同样属于盲目搜索。一般用队列数据结构来辅助实现BFS算法。


   算法步骤:
1. 首先将根节点放入队列中

2. 从队列中取出第一个节点,并检验它是否为目标。如果找到目标,则结束搜寻并回传结果,否则将它所有尚未检验过的直接子节点加入队列中

3. 若队列为空,表示整张图都检查过了——亦即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”

4. 重复步骤2

算法八:动态规划算法
动态规划(Dynamic programming)是一种在数学、计算机科学和经济学中使用的算法,通过把原问题分解为相对简单的子问题的方式求解一些复杂的问题。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分 (即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化为存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
算法步骤:
1. 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

2. 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

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

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

相关文章

Jmeter测试脚本编写详解(配详图)

一、简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数…

ORACLE数据库scott没有相关权限

1. 首先登陆具有DBA权限的用户 1.1 打开cmd 1.2 输入以下命令 sqlplus / as sysdab上述命令中的 / as sysdba 表示使用操作系统认证登录,同时指定DBA权限 1.3 回车执行命令,系统或将提示输入密码(没有则直接跳过) 1.4 密码正…

AndroidStudio-实现登录界面(数据存储在SQLite)

要求:每种错误信息采用Toast进行提示 (1)未注册的用户不能进行登录; (2)用户名和密码不能为空; (3)用户名不能重复; 一、创建新工程 点击next 修改名字 &…

JQuery 实现点击按钮添加及删除 input 框

前言 用于记录开发中常用到的,快捷开发 需求新增功能 比如说,我台设备可以设置一个或多个秘钥,有时候我配置一个秘钥时,就不需要多个输入框,当我想配置多个秘钥时,就需要添加多个输入框。 实现 HTML …

Adobe打印机另存pdf出错生成log文件,打印失败

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 用adobe打印机转pdf出错生成log文件,打印失败,log文件内容如下: %%[ ProductName: Distiller ]%% FZXBSJW--GB1-0 not found, using Courier. %%[ Error: typecheck; Offendi…

Mac安装MySQL详细教程

1、MySQL安装包下载 还没下载的话请前往官网下载 我们可以看到这里有两个不同架构的dmg的安装包,如果不知道自己电脑是ARM还是X86的话可以打开终端输入:uname -a 或者 uname -a | awk -F " " {print $(NF-1)} 来查看如下图: 这里显…

v-cloak和v-once和v-pre指令

v-cloak指令(没有值): 1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。 2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题 v-once: v-once指令: 1.v-once所在节点在初…

基于linux下的高并发服务器开发(第一章)- Linux开发环境搭建

​​​​​​基于linux下的高并发服务器开发(第一章)-Linux环境开发搭建1.1_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/131681333?spm1001.2014.3001.5501 解决Ubuntu 虚拟机没…

高数笔记01:函数、极限、连续

图源:文心一言 本文是我学习高等数学第一章的一些笔记和心得,主要介绍了函数、极限、连续这三个基本概念,以及它们的性质和很基础的计算技巧。希望可以与考研路上的小伙伴一起努力上岸~~🥝🥝 第1版:查资料…

Python自动化测试之cookie绕过登录(保持登录状态)

前言 在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证码会比较复杂,比如有些图形验证码,难以通过接口的方式去处理;再者&…

系统学习Halcon视觉软件指南

要系统学习Halcon视觉软件,您可以按照以下步骤进行: 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 学习基本概念:了解Halcon的基本概念和术语,例如图像处理、特征提取、图像匹配等。可以查阅Halcon的官方…

Web开发的富文本编辑器CKEditor介绍,Django有库ckeditor_uploader对它进行支持,django-ckeditor安装方法及使用注意事项

当需要在网页应用程序中提供富文本编辑功能时,CKEditor是一个流行的选择。CKEditor是一个开源的JavaScript富文本编辑器,它提供了强大的功能和用户友好的界面,使用户可以轻松创建和编辑格式化的文本内容。 以下是CKEditor的一些主要特性&…

MySQL进阶:函数

​ 在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提供了很多函数。函数可以理解为别人封装好的模板代码。 一、聚合函数 ​ 在MySQL中,聚合函数主要由:count、sum、min、max、avg组成,这些函数前面已经提过&…

std::stox类型

std::stod 函数原型 double stod (const string& str, size_t* idx 0); double stod (const wstring& str, size_t* idx 0);函数功能 将std::string字符串转化为双精度类型 函数参数 str 待转换的字符串 idx 如果idx的指针不为空,则该函数会将idx的…

为什么计算ORB特征点的时候还要取圆形而不是方形像素区域呢?

ORB (Oriented FAST and Rotated BRIEF)是一种在计算机视觉中广泛应用的特征检测和描述符算法。它的设计目的是为了快速、有效地提取图像中的关键点和描述符。在ORB的过程中,确实会涉及到提取圆形区域的操作,这主要出于以下的原因: 旋转不变性…

C++ VS 链接第三方库

C VS 链接第三方库 include lib dll 需要把动态库考到可执行程序的目录之下

客户异常数据清洗详细教程——pandas

前言 在不同行业中,我们经常会遇到一个麻烦的问题:数据清洗。尤其是当我们需要处理客户编码异常数据时,这个问题变得尤为重要。想象一下,许多银行都是以客户为单位管理数据的,因此每个客户都有一个独特的编码。在处理…

浅谈医院综合电气管理与节能措施

摘要:随着我国经济建设的不断加快,我国能源消耗也越来越大,如何通过电气能源管理实现节能是各行各业都在研究的课题。医院作为我国重要的医疗服务机构,能源管理是医院管理中的重要组成部分。本文将针对医院电气能源管理与节能措施…

关于Qt For android第一次编译时出现的问题

搞了三四天,搞的快崩溃了,问题提示为 FAILURE: Build failed with an exception.* What went wrong: A problem occurred configuring root project android-build. > Could not resolve all artifacts for configuration :classpath.> Could not…

53从零开始学Java之Integer底层原理探究

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在之前的两篇文章中,壹哥给大家介绍了Java中的包装类及其特点、用法,但是这些…