2024-10-23 11:31:39
程序员在开发中使用的十大基本算法
算法1:快速排序快速排序是由TonyHall开发的一种排序算法。平均来说,对N个项目进行排序需要ο(nlogn)次比较。在最坏的情况下,需要进行ο(N2)比较,但这种情况并不常见。事实上,快速排序通常比其他ο(nlogn)算法快得多,因为其内部循环可以在大多数架构中高效实现。
快速排序使用分治策略将一个列表分成两个子列表。
算法步骤:
1从序列中挑出一个元素,称之为“pivot”。
2重新排列顺序,所有小于基准值的元素放在基准前面,所有大于基准值的元素放在基准后面(相同的数字可以在两边)。在这个分区退出后,基准位于系列的中间。这称为分区操作。
3递归排序小于参考值的元素子系列和大于参考值的元素子系列。
在递归的最底层,序列的大小是零或一,也就是一直排序下去。虽然它一直在递归,但这种算法总是会退出,因为在每次迭代中,它至少会将一个元素放到最后一个位置。
算法2:堆排序算法
堆排序是指利用堆的数据结构设计的一种排序算法。Heap是一种类似于完全二叉树的结构,同时满足heap的性质:即子节点的键值或索引总是小于(或大于)其父节点。堆排序的平均时间复杂度为ο(nlogn)。
算法步骤:
1.创建一个堆H[0..n-1]
2.交换反应器的头部(最大值)和尾部。
3.将堆的大小减少1,并调用shift_down(0),以便将新数组顶部的数据调整到相应的位置。
4.重复步骤2,直到堆的大小为1
算法3:合并和排序
归并排序(台湾省译)是一种基于归并运算的有效排序算法。这个算法是分而治之的典型应用。
算法步骤:
算法4:二进制搜索算法
二进制搜索算法是一种在有序数组中寻找特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正是要搜索的元素,则搜索过程结束。如果某个元素比中间的元素大或小,则在数组中比中间的元素大或小的那一半中进行搜索,并从中间的元素开始比较。如果数组在某一步是空,说明找不到。这种搜索算法每次比较都将搜索范围缩小一半。对折搜索每次将搜索区域缩小一半,时间复杂度为ο(logn)。
算法5:BFPRT(线性搜索算法)
BFPRT算法解决的问题非常经典,就是从N个元素的某个序列中选择第K个最大(第K个最小)的元素。通过巧妙的分析,BFPRT可以保证在最坏的情况下,时间复杂度仍然是线性的。该算法的思想类似于快速排序的思想。当然,为了让算法在最坏的情况下仍然达到o(n)的时间复杂度,算法的五位作者做了细微的处理。
算法步骤:
终止条件:当n=1时,返回I个小元素。
算法6:DFS(深度优先搜索)
深度优先搜索算法是一种搜索算法。它沿着树的深度遍历树的节点,并尽可能深地搜索树的分支。当节点V的所有边都已被浏览时,搜索将返回到找到节点V的边的起始节点。这个过程一直持续到找到从源节点可到达的所有节点。如果还有未被发现的节点,选择其中一个作为源节点,重复上述过程。重复整个过程,直到所有节点都被访问。DFS属于盲搜索。
深度优先搜索是图论中的经典算法。利用深度优先搜索算法,可以生成目标图对应的拓扑排序表,利用拓扑排序表可以方便地解决许多相关的图论问题,如最大路径问题。使用通用堆数据结构来帮助实现DFS算法。
算法步骤:
上述描述可以是抽象的,例如:
DFS访问图中某个起始顶点V后,从V开始,访问任意相邻顶点W1;从w1开始,访问与w1相邻但尚未访问的顶点w2;然后从w2开始,进行类似的访问,?等等,直到到达所有相邻顶点都被访问过的顶点U。
然后,退一步回到之前刚访问过的顶点,看看是否还有其他相邻的顶点没有访问过。如果是,访问这个顶点,然后从这个顶点,进行与之前类似的访问;如果没有,就退一步搜索。重复上述过程,直到连通图中的所有顶点都被访问过。
算法7:BFS(广度优先搜索)
广度优先搜索算法是一种图形搜索算法。简单地说,BFS是一个从根节点开始,沿着树的宽度遍历树(图)的节点。如果访问了所有节点,则算法中止。BFS也属于盲目搜索。使用通用队列数据结构来帮助实现BFS算法。
算法步骤:
算法8:Dijkstra算法
Dijkstra的算法是由荷兰计算机科学家Azheldykstra提出的。Dikoscher算法使用广度优先搜索来解决非负加权有向图的单源最短路径问题,算法最终得到一棵最短路径树。这种算法常用于路由算法或作为其他图算法的子模块。
算法的输入包括一个加权有向图G和G中的一个源顶点S。我们用v表示G中所有顶点的集合。每个图的边是由两个顶点构成的有序元素对。(u,v)表示从顶点u到v有一条路连接,我们用E来表示G中所有边的集合,边的权重由权函数w定义:E→[0,∞]。因此,w(u,v)是从顶点u到顶点v的非负权重..边的权重可以被认为是两个顶点之间的距离。任意两点之间的路径的权重是该路径上所有边的权重之和。给定v中有顶点s和t,Dijkstra算法可以找到从s到t的最低权路径(例如最短路径)。该算法还可以找到从一个顶点S到图中任何其它顶点的最短路径。对于没有负权的有向图,Dijkstra算法是已知最快的单源最短路径算法。
算法步骤:
重复上述步骤2和3,直到所有顶点都包含在S中,即W=Vi。
算法9:动态规划算法
动态规划是数学、计算机科学和经济学中使用的一种方法,通过将原始问题分解为相对简单的子问题来解决复杂的问题。动态规划常用于子问题重叠且子结构性质最优的问题,动态规划方法所花费的时间往往远小于简单求解。
动态规划背后的基本思想非常简单。一般来说,解决一个给定的问题,需要求解它的不同部分(即子问题),然后将子问题的解组合起来,得到原问题的解。通常很多子问题都很相似,所以动态规划法尽量每个子问题只解一次,这样就减少了计算量:给定子问题的解一旦被计算出来,就会被记忆存储,下次需要同一个子问题的解时,可以直接在表中查找。当重复子问题的数量随着输入的大小呈指数增长时,这种方法特别有用。
关于动态规划最经典的问题是背包问题。
算法步骤:
算法10:朴素贝叶斯分类算法
朴素贝叶斯分类算法是一种基于贝叶斯定理的简单概率分类算法。贝叶斯分类以概率推理为基础,即在各种条件的存在不确定,只知道其发生的概率的情况下,如何完成推理和决策任务。概率推理对应于确定性推理。朴素贝叶斯分类器基于独立假设,即假设样本的每个特征与其他特征无关。
朴素贝叶斯分类器依赖于精确的自然概率模型,在有监督学习的样本集中可以获得非常好的分类结果。在许多实际应用中,朴素贝叶斯模型的参数估计使用最大似然估计方法,换句话说,朴素贝叶斯模型可以不使用贝叶斯概率或任何贝叶斯模型而工作。
尽管有这些天真的想法和过于简化的假设,朴素贝叶斯分类器仍然可以在许多复杂的真实情况下取得相当好的结果。
程序员用公司电脑还是自己电脑?
程序员用公司电脑。
因为在有些行业里面涉及到的是需要保密的,代码资料是不能外泄的,比如银行之类的金融机构是有严格的保密协议的,就是在公司办公都是不能够上网的是一个封闭的环境,所以必须要使用公司提供的电脑,但是有的也允许使用自己的电脑。
软件开发用i5还是i7好?
主要看应用和配置,光是I7I5处理器区别不会很大,但是一般的话I7的配置都会比I5的高。
1.IntelCorei7系列定位为发烧级、高性能用户专属,他们拥有4核心+8线程(Extreme系列则拥有6核心+12线程)、高主频、超大容量三级缓存等特性,性能是最强的,当然价格也是最贵的。游戏玩家、图形、设计工作者、视频编辑、多任务处理等对电脑性能有着最苛刻要求的用户,在资金充裕的前提下,首选i7系列处理器。
2.Corei5系列产品则可以看作i7的降低规格版本:i5系列多为4核心+4线程的规格,缓存容量和处理器频率略低于i7,取消了多线程特性,这一点的主要影响在于多任务的处理、大型设计、3D软件的优化上。而对于此外的大部分游戏、程序来说,i5和i7的运行效率差异并不大。也就是说,如果不是确定自己常用的应用需要超线程技术,那么i5处理器会是比i7更加有性价比的选择。