程序员必须知道的十大基础实用算法及其讲解


本文盘点程序员必须知道的十大基础实用算法及其讲解。



算法一:快速排序算法


快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(nlogn) 次比较。在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来。


快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists)。


算法步骤:

1. 从数列中挑出一个元素,称为「基准」(pivot),

2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。




算法二:堆排序算法


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


堆排序的平均时间复杂度为Ο(nlogn)。


算法步骤:

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

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

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

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




算法三:归并排序


归并排序(Mergesort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。


算法步骤:

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

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

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

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

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




算法四:二分查找算法


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



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


BFPRT 算法解决的问题十分经典,即从某 n 个元素的序列中选出第 k 大(第 k 小)的元素,通过巧妙的分析,BFPRT 可以保证在最坏情况下仍为线性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到 o(n) 的时间复杂度,五位算法作者做了精妙的处理。


算法步骤:

1. 将 n 个元素每 5 个一组,分成 n/5(上界) 组。

2. 取出每一组的中位数,任意排序方法,比如插入排序。

3. 递归的调用 selection 算法查找上一步中所有中位数的中位数,设为 x,偶数个中位数的情况下设定为选取中间小的一个。

4. 用 x 来分割数组,设小于等于 x 的个数为 k,大于 x 的个数即为 n-k。

5. 若 i==k,返回 x;若 i<k,在小于 x 的元素中递归查找第 i 小的元素;若 i>k,在大于 x 的元素中递归查找第 i-k 小的元素。

终止条件:n=1 时,返回的即是 i 小元素。



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


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


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


深度优先遍历图算法步骤:

1. 访问顶点 v;

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

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

上述描述可能比较抽象,举个实例:

DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从 w1 出发,访问与 w1 邻接但还没有访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,…如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。

接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。



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


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


算法步骤:

1. 首先将根节点放入队列中。

2. 从队列中取出第一个节点,并检验它是否为目标。

如果找到目标,则结束搜寻并回传结果。

否则将它所有尚未检验过的直接子节点加入队列中。

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

4. 重复步骤 2。




算法八:Dijkstra算法


戴克斯特拉算法(Dijkstra』salgorithm)是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出。迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。


该算法的输入包含了一个有权重的有向图 G,以及 G 中的一个来源顶点 S。我们以 V 表示 G 中所有顶点的集合。每一个图中的边,都是两个顶点所形成的有序元素对。(u,v) 表示从顶点 u 到 v 有路径相连。我们以 E 表示 G 中所有边的集合,而边的权重则由权重函数 w:E→[0,∞] 定义。因此,w(u,v) 就是从顶点 u 到顶点 v 的非负权重(weight)。边的权重可以想像成两个顶点之间的距离。任两点间路径的权重,就是该路径上所有边的权重总和。已知有 V 中有顶点 s 及 t,Dijkstra 算法可以找到 s 到 t 的最低权重路径 (例如,最短路径)。这个算法也可以在一个图中,找到从一个顶点 s 到任何其他顶点的最短路径。对于不含负权的有向图,Dijkstra 算法是目前已知的最快的单源最短路径算法。


算法步骤:

1. 初始时令 S={V0},T={其余顶点},T 中顶点对应的距离值

若存在,d(V0,Vi) 为弧上的权值

若不存在,d(V0,Vi) 为∞

2. 从 T 中选取一个其距离值为最小的顶点 W 且不在 S 中,加入 S

3. 对其余 T 中顶点的距离值进行修改:若加进 W 作中间顶点,从 V0 到 Vi 的距离值缩短,则修改此距离值

重复上述步骤 2、3,直到 S 中包含所有顶点,即 W=Vi 为止





算法九:动态规划算法


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


动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。


关于动态规划最经典的问题当属背包问题。


算法步骤:

1. 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

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



算法十:朴素贝叶斯分类算法


朴素贝叶斯分类算法是一种基于贝叶斯定理的简单概率分类算法。贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况下,如何完成推理和决策任务。概率推理是与确定性推理相对应的。而朴素贝叶斯分类器是基于独立假设的,即假设样本每个特征与其他特征都不相关。


朴素贝叶斯分类器依靠精确的自然概率模型,在有监督学习的样本集中能获取得非常好的分类效果。在许多实际应用中,朴素贝叶斯模型参数估计使用最大似然估计方法,换言之朴素贝叶斯模型能工作并没有用到贝叶斯概率或者任何贝叶斯模型。


尽管是带着这些朴素思想和过于简单化的假设,但朴素贝叶斯分类器在很多复杂的现实情形中仍能够取得相当好的效果。


来源:CSDN大数据


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

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

相关文章

sql 日期和当前日期时间差_详解PostgreSQL 如何获取当前日期时间

概述开发数据库应用或者调试代码时&#xff0c;经常需要获取系统的当前日期和时间&#xff0c;今天主要看一下 PostgreSQL 中提供的相关函数。一、当前日期CURRENT_DATECURRENT_DATE 函数用于获取数据库服务器的当前日期&#xff1a;postgres# SELECT CURRENT_DATE;调用该函数时…

聊聊如何构建自驱团队(3)

聊聊如何构建自驱团队&#xff08;3&#xff09;“道“和”术“对于技术出生的管理者在进行问题思考时&#xff0c;总会深陷“术”和“道”两层维度问题的困扰&#xff1a;“道”就是平时大家提到的理论实践&#xff0c;而“术”则是与实际相匹配的一些方法。敏捷项目管理为构建…

linux c 数据库访问框架,linux c 开发通用结构,框架

了解其它语言的框架例&#xff1a;java Struts1、Struts2、Hibernate、Mybatis、Ibatis、Spring 等等&#xff0c;利用这些框架能够快速的开发出稳定的应用程序,在java中这些框架的功能主要提供一些浓缩版的功能。仔细思索&#xff1a;其它语言的通用结构&#xff1f;例&#x…

python list常用方法_Python中列表(List)的基本用法

一、列表的创建 list((3, 5, 7, 9, 11)) list(range(1, 10, 2)) """ 字符串、集合、字典的键、字典的键&#xff1a;值对转列表 """ list(hello, world) list({3, 7, 8}) list({a:3, b:9, c:78}) list({a:3, b:9, c:78}.items()) ""&q…

我们只知大势将至,却不知未来已来

❈ 凯文•凯利 《必然》&#xff1a; 未来的一切事物的生命都将是无穷尽的升级&#xff0c;而且迭代的速度不断的在加速。包括看得见的事物&#xff0c;也包括看不见的审美观和价值观。无论你使用一项工具的时间有多长&#xff0c;不断的升级都会把你变成一个菜鸟&#xff0c;从…

c#爬虫-1688官网自动登录

背景在1688官网里面有很多信息是需要登录才能看得到的&#xff0c;比如商家的联系电话等等。那么我们在抓取它的网页的时候&#xff0c;肯定是需要维持登录状态才能得到对应的内容。这里面就会涉及到自动登录的问题。登录地址https://login.1688.com/member/signin.htm自动登录…

tensorrt轻松部署高性能dnn推理_部署环境之:tensorRT的插件

TensorRT是一个高性能的深度学习推理&#xff08;Inference&#xff09;优化器&#xff0c;可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持TensorFlow、Caffe、Mxnet、Pytor…

linux网卡驱动 pdf,Linux下网卡驱动程序.pdf

zekairecv 于 2015-10-04 00:58:57发表:谢谢weilee1 于 2015-04-19 17:41:05发表:看看雪语阑风 于 2014-12-04 11:03:39发表:楼主好人Doctor易 于 2014-10-08 13:06:25发表:也不说网卡型号吗wzj3521787 于 2014-09-12 11:12:10发表:这是指网卡驱动编程还是编译lcdstrongman_hw …

python数学计算_初学者Python学习笔记--数学计算

四则运算 加减乘除 1 2 3 10 - 6 4 5 * 5 25 20 / 5 4.0 3 ** 3 27 取整计算 13//3 4 取余数计算 13%3 1 计算顺序&#xff0c;括号>乘除>加减 4 5 - (36) * 2 -9 特殊赋值&#xff0c;可以用_来分割数字&#xff0c;简便识别 num 111_222_333 num 111222333 四舍五入…

做一个网站多少钱?

「一辆车子多少钱&#xff1f;一个房子多少钱&#xff1f;」 这问题在工程师或设计师的眼里就如「一辆车子多少钱&#xff1f;一个房子多少钱&#xff1f;」,这个问题实在空泛到一个让人无法言语的境界&#xff0c;这也是我最常被问到的问题「做一个网站多少钱&#xff1f;」。…

[Abp 源码分析]多租户体系与权限验证

点击上方蓝字关注我们0.简介承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的。1.多租户的概念多租户系统又被称之为 Saas &#xff0c;比如阿里云就是一个典型的多租户系统&#xff0…

python中csv文件把成绩加入_【学习笔记】python3中csv文件使用

1. readercsv.reader(f, delimiter,)&#xff1a;按行读取数据&#xff0c;reader为生成器&#xff0c;读取的每行数据为列表格式&#xff0c;可以通过delimiter参数指定分隔符。import csvwith open(data.csv, encodingutf-8) as f:reader csv.reader(f)header next(reader)…

生存是一种毅力

三月初回到成都,出站时还是凌晨5点多,第一次这么早站在成都的火车站,拥挤的人群和车辆,我的神志却异常的清醒,坚持不要母亲来接我. 到家洗漱后到头就睡,一觉醒来10点多,中午的成都虽不像北京那么阳光普照但也感觉暖暖的.想起在北京训练营的日子,"枯藤老树昏鸦"每天伴…

linux truncate文件,linux系统编程:用truncate调整文件大小

truncate的使用非常简单&#xff1a;int truncate(const char *path, off_t length);参数1&#xff1a;文件名参数2: 文件需要被调整的大小length 大于 文件大小&#xff0c; 文件后面会填充空白字节或者空洞length 小于 文件大小&#xff0c; 文件多出的部分&#xff0c;会被…

python数据分析与展示 pdf课件_python数据分析与展示 课件 相关实例(示例源码)下载 - 好例子网...

开发语言&#xff1a;Python | 大小&#xff1a;9.84KB | 发布时间&#xff1a;2020-05-13 | 立即下载 开发语言&#xff1a;Python | 大小&#xff1a;0.24M | 发布时间&#xff1a;2019-09-09 | 立即下载 开发语言&#xff1a;Python | 大小&#xff1a;0.15M | 发布时间&…

如何在 ASP.Net Core 中使用 SignalR

SignalR for ASP.Net Core 是 SignalR 的浴火重生版&#xff0c;允许你在 ASP.Net Core 中实现实时通讯&#xff0c;这里的 实时 意味着双方都能快速的感知对方发来的消息&#xff0c;比如&#xff1a;一旦 server 端有需要推送的内容将会直接 push 到 client&#xff0c;这和原…

搞笑动图:这些痛,只有程序员懂…

“代码上线后又追加了新特性” “在生产环境做 hotfix” “刚调稳定的系统&#xff0c;公司叕空降了一位架构师&#xff0c;叕要重构现有系统…… ” “当程序员听客户说还在用 IE 时” “当黑客拿到 root 权限之后” “代码进入循环分支后” “项目交接&#xff0c;客户要求开…

python中闭包不是立刻执行_一道神奇的Python面试题,你会吗?

无意间&#xff0c;看到这么一道Python面试题&#xff1a;以下代码将输出什么&#xff1f;def testFun():temp [lambda x : i*x for i in range(4)]return tempfor everyLambda in testFun():print (everyLambda(2))脑中默默一想&#xff0c;这还用说么&#xff0c;肯定是&…

.net 中通用的formatstring格式符整理

格式化日期和数字的字符串经常要用到这个, 就把帮助里面的东西大概整理了一些列在这里了. 下表描述了用来格式化 DateTime 对象的标准格式说明符。 格式说明符名称说明d短日期模式显示由与当前线程关联的 DateTimeFormatInfo.ShortDatePattern 属性定义的模式或者由指定格式提供…

linux内核分为子系统,Linux内核内存管理子系统分析【转】

还是那张熟悉的老图&#xff1a;Linux内核子系统简介(由七个部分组成)Linux内存管理模型&#xff1a;1. 内存管子系统职能&#xff1a;1> 管理虚拟地址与物理地址的映射2> 管理物理内存的分配2. 地址映射管理1> 虚拟地址空间分布&#xff1a;linux采用的是一种虚拟地…