算法_算法 java - CSDN
算法 订阅
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。形式化算法的概念部分源自尝试解决希尔伯特提出的判定问题,并在其后尝试定义有效计算性或者有效方法中成形。这些尝试包括库尔特·哥德尔、Jacques Herbrand和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当前,依然常有直觉想法难以定义为形式化算法的情况。 展开全文
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。形式化算法的概念部分源自尝试解决希尔伯特提出的判定问题,并在其后尝试定义有效计算性或者有效方法中成形。这些尝试包括库尔特·哥德尔、Jacques Herbrand和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当前,依然常有直觉想法难以定义为形式化算法的情况。
信息
特    征
有穷性 确切性 输入 输出 可行
常    用
计算、数据处理和自动推理
外文名
Algorithm
中文名
算法
学    科
数学 计算机
算法特征
一个算法应该具有以下五个重要的特征:(Finiteness)算法的有穷性是指算法必须能在执行有限个步骤之后终止;(Definiteness)算法的每一步骤必须有确切的定义;(Input)一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;(Output)一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;(Effectiveness)算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。
收起全文
精华内容
参与话题
  • 算法基础入门:90分钟搞定动态规划

    千人学习 2020-07-15 10:25:52
    为什么人人都要学算法? 程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点。很多人觉得像人工智能、数据搜索与挖掘这样高薪的工作才用得上算法,觉得...
  • 【经典算法大全】收集51种经典算法 初学者必备

    万次阅读 多人点赞 2018-05-23 13:50:58
    《经典算法大全》是一款IOS平台的应用。里面收录了51种常用算法,都是一些基础问题。博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍。 虽然网上也有博客贴了出来,但是...

    《经典算法大全》是一款IOS平台的应用。里面收录了51种常用算法,都是一些基础问题。博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍。

    虽然网上也有博客贴了出来,但是自己写写感觉总是好的。现在分享个大家。

    代码和运行结果难免有出错的地方,请大家多多包涵。

     

    1.河内之塔(汉诺塔

    2.费式数列

    3.巴斯卡三角形

    4.三色棋

    5.老鼠走迷宫(1)

    6.老鼠走迷宫(2)

    7.骑士走棋盘

    8.八皇后

    9.八枚银币

    10.生命游戏

    11.字串核对

    12.双色河内塔三色河内塔

    13.背包问题 

    14.蒙地卡罗法求PI

    15.Eratosthenes筛选求质数

    16.超长整数运算(大数运算)  同时建议参考这篇文章:大数的四则运算-海子的博客园

    17.长PI

    18.最大公因数,最小公倍数,因式分解

    19.完美数

    20.阿姆斯壮数

    21.最大访客数

    22.中序转后序式(前序式  相关文章:中缀表达式值问题

    23.后序式运算 

    24.洗扑克牌(乱数排列)

    25.Craps赌博游戏

    26.约瑟夫问题

    27.排列组合   相关文章:母函数与排列组合

    28.格雷码(Gray Code)

    29.产生可能的集合  相关文章:集合划分问题

    30.m元素集合的n个元素子集

    31.数字拆解

    32.得分排行

    33.选择,插入,冒泡排序

    34.shell 排序法-改良的插入排序

    35.shaker排序法-改良的冒泡排序

    36.改良的选择排序

    37.快速排序法一

    38.快速排序法二

    39.快速排序法三

    40.合并排序法

    41.基数排序法

    42.循环搜寻法(使用卫兵)

    43.二分搜寻法(二分查找法,折半查找法)  相关文章:二分查找

    44.插补搜寻法

    45.费式搜寻法

    46.稀疏矩阵

    47.多维矩阵转一维矩阵

    48.上三角,下三角,对称矩阵

    49.奇数魔方阵

    50.4N魔方阵

    51.2(2N+1)魔方阵

     

    展开全文
  • 10大计算机经典算法

    万次阅读 多人点赞 2017-06-01 17:00:39
    算法一:快速排序法    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常...
    算法一:快速排序法                            

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

    快速排序使用分治法(Divide and conquer)策略来把一个串行(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

                               

    算法三:归并排序                            

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

    算法步骤:

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

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

    算法步骤:

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

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

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

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

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

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

                           

    算法九:动态规划算法                            

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

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

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

    算法步骤:

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

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

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

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

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


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

    展开全文
  • 程序员必学的十个算法

    千次阅读 2018-06-22 10:36:32
    转载请在文章开头注明作者和出处作者: ChainGod(孙飞)原文链接: http://chaingod.io/article/14算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较...

    转载请在文章开头注明作者和出处

    作者: ChainGod(孙飞)

    原文链接: http://chaingod.io/article/14


    算法一:快速排序算法

    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
    快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

    算法步骤:
    1 从数列中挑出一个元素,称为 “基准”(pivot),
    2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
    3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
    递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

    算法二:堆排序算法

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

    堆排序的平均时间复杂度为Ο(nlogn) 。
    算法步骤:
    创建一个堆H[0…n-1]
    把堆首(最大值)和堆尾互换
    3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置
    4. 重复步骤2,直到堆的尺寸为1


    算法三:归并排序

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

    算法步骤:

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

    该算法的输入包含了一个有权重的有向图 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中顶点对应的距离值
      若存在<v0,vi>,d(V0,Vi)为<v0,vi>弧上的权值
      若不存在<v0,vi>,d(V0,Vi)为∞

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

    3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值
      重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

    算法九:动态规划算法

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

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

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

    算法步骤:

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

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

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

    朴素贝叶斯分类算法是一种基于贝叶斯定理的简单概率分类算法。贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况下, 如何完成推理和决策任务。概率推理是与确定性推理相对应的。而朴素贝叶斯分类器是基于独立假设的,即假设样本每个特征与其他特征都不相关。
    朴素贝叶斯分类器依靠精确的自然概率模型,在有监督学习的样本集中能获取得非常好的分类效果。在许多实际应用中,朴素贝叶斯模型参数估计使用最大似然估计方法,换言之朴素贝叶斯模型能工作并没有用到贝叶斯概率或者任何贝叶斯模型。


    作者:
    链接:https://www.imooc.com/article/31122
    来源:慕课网
    展开全文
  • 大神的算法学习之路

    万次阅读 多人点赞 2018-10-29 18:30:58
    严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的。 原文链接:...

    我的算法学习之路

    关于

    严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的。

    原文链接:http://zh.lucida.me/blog/on-learning-algorithms/

    原文作者:Lucida

    这篇文章讲了什么?

    • 我这些年学习数据结构和算法的总结。
    • 一些不错的算法书籍和教程。
    • 算法的重要性。

    初学

    第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——反正最后考试划个重点也能过,于是这门整个计算机专业本科最重要的课程就被傻逼的我直接忽略过去了。

    直到大三我才反应过来以后还要找工作——而且大二的折腾证明了我并没有什么商业才能,以后还是得靠码代码混饭吃,我当时惊恐的发现自己对编程序几乎一无所知,于是我给自己制订了一个类似于建国初期五年计划的读书成长计划,其中包括C语言基础、数据结构以及计算机网络等方面的书籍。

    读书计划的第一步是选择书籍,我曾向当时我觉得很牛的"学长"和"大神"请教应该读哪些算法书籍,"学长"们均推荐算法导论,还有几个"大神"推荐计算机程序设计艺术(现在我疑心他们是否翻过这些书),草草的翻了下这两本书发现实在看不懂,但幸运的是我在无意中发现了豆瓣这个神奇的网站,里面有很多质量不错的书评,于是我就把评价很高而且看上去不那么吓人的计算机书籍都买了下来——事实证明豆瓣要比这些"学长"或是"大神"靠谱的多得多。

    数据结构与算法分析——C语言描述

    数据结构与算法分析——C语言描述

    数据结构与算法分析——C语言描述是我学习数据结构的第一本书:当时有很多地方看不懂,于是做记号反复看;代码看不明白,于是抄到本子上反复研读;一些算法想不通,就把它所有的中间状态全画出来然后反复推演。事实证明尽管这种学习方法看起来傻逼而且效率很低,但对于当时同样傻逼的我却效果不错——傻人用傻办法嘛,而且这本书的课后题大多都是经典的面试题目,以至于日后我看到编程之美的第一反应就是这货的题目不全是抄别人的么。

    至今记得,这本书为了说明算法是多么重要,在开篇就拿最大子序列和作为例子,一路把复杂度从O(N^3)杀到O(N^2)再到O(NlgN)最后到O(N),当时内心真的是景仰之情=如滔滔江水连绵不绝,尼玛为何可以这么屌,

    此外,我当时还把这本书里图算法之前的数据结构全手打了一遍,后来找实习还颇为自得的把这件事放到简历里,现在想想真是傻逼无极限。

    凭借这个读书成长计划中学到的知识,我总算比较顺利的找到了一份实习工作,这是后话。

    入门

    我的实习并没有用到什么算法(现在看来就是不停的堆砌已有的API,编写一堆自己都不知道对不对的代码而已),在发现身边的人工作了几年却还在和我做同样的事情之后,我开始越来越不安。尽管当时我对自己没什么规划,但我清楚这绝壁不是我想做的工作。

    微软的梦工厂

    微软的梦工厂

    在这个摇摆不定的时刻,微软的梦工场成了压倒骆驼的最后一支稻草,这本书对微软亚洲研究院的描写让我下定了"找工作就要这样的公司"的决心,然而我又悲观的发现无论是以我当时的能力还是文凭,都无法达到微软亚研院的要求,矛盾之下,我彻底推翻了自己"毕业就工作"的想法,辞掉实习,准备考研。

    考研的细节无需赘述,但至今仍清楚的记得自己在复试时惊奇且激动的发现北航宿舍对面就是微软西格玛大厦,那种离理想又进了一步的感觉简直爽到爆。

    算法设计与分析

    我的研究生生涯绝对是一个反面典型——翘课,实习,写水论文,做水研究,但有一点我颇为自得——从头到尾认真听了韩军教授的算法设计与分析课程。

    韩军给我印象最深的有两点:课堂休息时跑到外面和几个学生借火抽烟;讲解算法时的犀利和毫不含糊。

    算法设计与分析基础

    尽管韩军从来没有主动提及,但我敢肯定算法设计与分析基础就是他算法课程事实上的(de-facto)教材,因为他的课程结构几乎和这本书的组织结构一模一样。

    如果数据结构与算法分析——C语言描述是我的数据结构启蒙,那么韩军的课程和算法设计与分析基础就是我的算法启蒙,结合课程和书籍,我一一理解并掌握了复杂度分析、分治、减治、变治、动态规划和回溯这些简单但强大的算法工具。

    算法引论

    算法引论

    算法引论是我这时无意中读到的另一本算法书,和普通的算法书不同,这本书从创造性的角度出发——如果说算法导论讲的是有哪些算法,那么算法引论讲的就是如何创造算法。结合前面的算法设计与分析基础,这本书把我能解决的算法问题数量扩大了一个数量级。

    之后,在机缘巧合下,我进入微软亚洲工程院实习,离理想又近了一步,自我感觉无限牛逼。

    巩固

    在微软工程院的实习是我研究生阶段的一个非常非常非常重要的转折点:

    1. 做出了一个还说的过去的小项目。
    2. 期间百度实习面试受挫,痛定思痛之下阅读了大量的程序设计书。
    3. 微软的实习经历成为了我之后简历上为数不多的亮点之一(本屌一没成绩,二没论文,三没ACM)。

    这里就不说1和3了(和本文题目不搭边),重点说说2。

    由于当时组内没有特别多的项目,我负责的那一小块又提前搞定了,mentor便很慷慨的扔给我一个Kinect和一部Windows Phone让我研究,研究嘛,自然就没有什么deadline,于是我就很鸡贼的把时间三七开:七分倒腾Windows Phone,三分看书&经典论文。

    然而一件事打断了这段安逸的生活——

    百度实习面试

    基友在人人发百度实习内推贴,当时自我感觉牛逼闪闪放光芒,于是就抱着看看国内IT环境+虐虐面试官的变态心理投了简历,结果在第一面就自己的师兄爆出翔:他让我写一个stof(字符串转浮点数),我磨磨唧唧半天也没写出完整实现,之后回到宿舍赶快写了一个版本发到师兄的邮箱,结果对方压根没鸟我。

    这件事对我产生了很大的震动——

    • 原来自己连百度实习面试都过不去。
    • 原来自己还是一个编程弱逼。
    • 原来自己还是一个算法菜逼。

    痛定思痛,我开始了第二个"五年计划",三七开的时间分配变成了七三开:七分看书,三分WP。而这一阶段的重点从原理(Principle)变成了实现(Implementation)——Talk is cheap, show me the code.

    Elements of Programming

    Elements of Programming

    由于一直觉得名字里带"Elements of"的都是酷炫叼炸天的书,所以我几乎是毫不犹豫的买了这本Elements of Programming(中译本:编程原本),事实上这本书里的代码(或者说STL的代码)确实是:快,狠,准,古龙高手三要素全齐。

    C Interfaces and Implementation

    C Interfaces and Implementation

    百度面试被爆出翔的经历让我意识到另一个问题,绝大多数公司面试时都需要在纸上写C代码,而我自己却很少用C(多数情况用C#),考虑到自己还没牛逼到能让公司改变面试流程的地步,我需要提升自己编写C代码的能力(哪怕只是为了面试)。一顿Google之后,我锁定了C Interfaces and Implementation——另一本关于如何写出狂炫酷帅叼炸天的C代码的奇书,这里套用下Amazon的评论:Probably the best advanced C book in existance。

    严格来说上面两本书都不是传统的算法书,因为它们侧重的都不是算法,而是经典算法的具体实现(Implementation),然而这正是我所需要的:因为算法的原理我能说明白,但要给出优雅正确简练的实现我就傻逼了,哪怕是stof这种简单到爆的"算法"。

    依然是以前的傻逼学习方法:反复研读+一遍又一遍的把代码抄写到本子上,艰难的完成了这两本书后,又读了相当数量的编程实践(Programming Practice)书籍,自我感觉编程能力又大幅提升,此外获得新技能——纸上编码。这也成为了我之后找工作面试的三板斧之一。

    应用

    说老实话,自从本科实习之后,我就一直觉得算法除了面试时能用用,其它基本用不上,甚至还写了一篇当时颇为自得现在读起来极为傻逼的文章来黑那些动不动就"基础"或"内功"的所谓"大牛"们,这里摘取一段现在看起来很傻逼但当时却觉得是真理的文字:

    所以那些动则就扯什么算法啊基础啊内功啊所谓的大牛们,请闭上你的嘴,条条大道通罗马。算法并不是编程的前提条件,数学也不会阻碍一个人成为优秀的程序员。至少在我看来,什么算法基础内功都是唬人的玩意,多编点能用的实用的程序才是王道,当然如果你是一个pure theorist的话就当我什么都没说好了。

    然而有意思的是,写了这篇文章没多久,鼓吹算法无用论的我自己做的几个大大小小的项目全部用到了算法——我疑心是上天在有意抽我的脸。

    LL(k)

    我在微软实习的第一个项目做的是代码覆盖率分析——计算T-SQL存储过程的代码覆盖率。

    简单的看了下SQL Server相关的文档,我很快发现SQL Reporting Service可以记录T-SQL的执行语句及行号,于是行覆盖(line coverage)搞定,但老大说行覆盖太naive,我们需要更实际的块覆盖(block coverage)。

    阅读了块覆盖的定义后,我发现我需要对T-SQL进行语法分析,在没有找到一个好用的T-SQL Parser的情况下,只能自己动手搞一个:

    Language Implementation Patterns

    比较奇诡的是,做这个项目时当时我刚好把ANTLR作者的Language Implementation Patterns(中译本:编程语言实现模式)看了一半,什么LL(k)啊Packrat啊AST Walker的概念啊正热乎着呢。

    于是,自己自己就照着T-SQL的官方EBNF,三下五除二撸了一个T-SQL存储过程的LL(k) Parser,把代码转换成AST,然后用一个External AST Walker生成代码块覆盖的HTML报表,全部过程一周不到。

    老大自然是很满意——我疑心他的原计划是花两三个月来完成这个项目,因为这个项目之后的两个月我都没什么活干,天天悠哉游哉。

    拼音索引

    拼音索引是我接的一个手机应用私活里的小模块,用户期待在手机文本框可以根据输入给出智能提示:

    比如说输入中国:

    智能提示

    同样,输入拼音也应给出提示:

    智能提示

    中文匹配这个简单,但拼音匹配就得花时间想想了——懒得造轮子的我第一时间找到了微软的拼音库,但接下来我就发现微软这个鸟库在手机上跑不动,研究了下发现WP7对Dictionary的items数量有限制,貌似是7000还是8000个item就会崩盘,而标准汉字则有两万多个,尼玛。

    痛骂MS坑爹+汉字坑爹之余,还是得自己撸一个库出来:

    1. 首先把那两万个汉字搞了出来,排序,然后弄成一个超长的字符串。
    2. 接下来用Int16索引了汉字所有的拼音(貌似500多个)。
    3. 再接下来用Int64建立汉字和拼音的关联——汉字有多音字,所以需要把多个拼音pack到一个Int64里,这个简单,位操作就搞定。
    4. 最后用二分+位移Unpack,直接做到从汉字到拼音的检索。
    5. 后来小测了下性能,速度是MS原来那个库的五十倍有余,而代码量只有336行。

    用户很happy——因为我捎带把他没想到的多音字都搞定了,而且流畅的一逼。

    我也很happy,因为没想到自己写的库居然比MS的还要快几十倍,同时小十几倍。

    从这个事情之后我变得特别理解那些造轮子的人——你要想想,如果你需要一个飞机轮子但市场上只有自行车轮子而且老板还催着你交工,你能怎么搞

    快速字符串匹配

    前面提到在微软实习时老大扔给我一个Windows Phone让我研究下,我当时玩了玩就觉着不太对劲,找联系人太麻烦。

    比如说找"张晓明",WP只支持定位到Z分类下——这意味着我需要在Z分类下的七十多个联系人(姓张的姓赵的姓钟的等等)里面线性寻找,每次我都需要滑动四五秒才能找到这个张姓少年。

    E51

    这TMD也太傻逼了,本屌三年前的老破NOKIA都支持首字母定位,996->ZXM->张晓明,直接搞定,尼玛一个新时代Windows Phone居然会弱到这个程度。

    搜了一下发现没有好用的拨号程序,于是本屌就直接撸了一个支持首字母匹配的拨号程序出来扔到WP论坛里。

    结果马上就有各种问题出现——最主要的反映是速度太慢,一些用户甚至反馈按键有时要半秒才有反应。本屌问了下他的通讯录大小:大概3000多人。

    Cry

    吐槽怎么会有这么奇葩的通讯录之余,我意识到自己的字符串匹配算法存在严重的性能问题:读取所有人的姓名计算出拼音,然后一个个的匹配——结果如果联系人数量太多的话,速度必然拙计。

    于是我就开始苦思冥想有没有一个能够同时搜索多个字符串的高端算法,以至于那两天坐地铁都在嘟囔怎么才能把这个应用搞的快一些。

    Algorithms on Strings, Trees and Sequences

    最终还是在Algorithms on Strings, Trees and Sequences里找到了答案——确实有能够同时搜索多个字符串的方法:Tries,而且这本书还用足足一章来讲怎么弄Multiple string comparison,看得我当时高潮迭起,直呼过瘾。

    具体细节不多说,总之换了算法之后,匹配速度快了大约九十多倍,而且代码还短了几十行。哪怕是有10000个联系人,也能在0.1秒内搞定,速度瓶颈就这样愉快的被算法搞定。

    Writing Efficient Programs

    之后又做了若干个项目,多多少少都用到了"自制"的算法或数据结构,最奇诡的一次是写一个电子书阅读器里的分页,我照着模拟退火(Simulated Annealing)的原理写了一个快速分页算法,事实上这个算法确实很快——但问题是我都不知道为啥它会这么快。

    总之,算法是一种将有限计算资源发挥到极致的武器,当计算资源很富余时算法确实没大用,但一旦到了效率瓶颈算法绝壁是开山第一刀(因为算法不要钱嘛!要不还得换CPU买SSD升级RAM,肉疼啊!!)。一些人会认为这种说法是有问题,因为编写新算法的人力成本有时比增加硬件的成本还要高——但别忘了增加硬件提升效率也是建立在算法是Scalable的基础上——说白了还是得撸算法。

    Writing Efficient Programs

    说到优化这里顺带提一下Writing Efficient Programs——很难找到一本讲代码优化的书(我疑心是自从Knuth说了过早优化是万恶之源之后没人敢写,万恶之源嘛,写它干毛),注意这本书讲的是代码优化——在不改变架构、算法以及硬件的前提之下进行的优化。尽管书中的一些诸如变量复用或是循环展开的trick已经过时,但总体仍不失为一本好书。

    提高

    实习实习着就到了研二暑假,接下来就是求职季。

    求职季时我有一种莫名的复仇感——尼玛之前百度实习面试老子被你们黑的漫天飞翔,这回求职老子要把你们一个个黑回来,尼玛。

    现在回想当时的心理实属傻逼+幼稚,但这种黑暗心理也起了一定的积极作用:我丝毫不敢有任何怠慢,以至于在5月份底我就开始准备求职笔试面试,比身边的同学早了两个月不止。

    我没有像身边的同学那般刷题——而是继续看书抄代码学算法,因为我认为那些难得离谱的题面试官也不会问——事实上也是如此。

    Algorithm Design Manual

    Algorithm Design Manual

    因为很多Coding Interview的论坛都提到这本红皮书,我也跟风搞了一本。事实证明,仅仅是关于Backtrack Template那部分的描述就足以值回书价,更不用说它的Heuristics和课后题。

    编程珠玑&更多的编程珠玑

    Programming Pearls

    More Programming Pearls

    这两本书就不用多介绍,编程珠玑更多的编程珠玑,没听说过这两本书请自行面壁。前者偏算法理论,后者偏算法轶事,前者提升能力,后者增长谈资,都值得一读。

    The Science of Programming

    The Science of Programming

    读到编程珠玑里面关于Binary Search的正确性证明时我大呼过瘾,原来程序的正确性也是可以推导的,然后我就在那一章的引用里发现David Gries的The Science of Programming。看名字就觉得很厉害,直接搞了一本开撸。

    不愧为编程珠玑引用的书籍,撸完The Science of Programming之后,本屌获得了证明简单代码段的正确性这个技能——求职面试三板斧之二。

    证明简单代码段的正确性是一个很神奇的技能——因为面试时大多数公司都会要求在纸上写一段代码,然后面试官检查这段代码,如果你能够自己证明自己写的代码是正确的,面试官还能挑剔什么呢?

    之后就是各种面试,详情见之前的博客,总之就是项目经历纸上代码正确性证明这三板斧,摧枯拉朽。

    进化

    求职毕业季之后就是各种Happy,Happy过后本屌发现即将面临另一个问题:算法能力不足。

    因为据说以后的同事大多是ACM选手,而本屌从来没搞过算法竞赛,而且知道的算法和数据结构都极为基础:像那些元胞自动机、斐波那契堆或是线段树这些高端数据结构压根只是能把它们的英文名称拼写出来,连用都没用过,所以心理忐忑的一逼。

    为了不至于到时入职被鄙视的太惨烈,加上自己一贯的算法自卑症,本屌强制自己再次学习算法:

    Algorithms 4th

    Algorithms

    Algorithms是我重温算法的第一本书,尽管它实际就是一本数据结构的入门书,但它确实适合当时已经快把算法忘光的本屌——不为学习,只为重温。

    这本书最大的亮点在于它把Visualization和Formatting做到了极致——也许它不是最好的数据结构入门书,但它绝壁是我读过的排版最好的书,阅读体验爽的一逼;当然这本书的内容也不错,尤其是红黑树那一部分,我想不会有什么书会比此书讲的更明白。

    6.851 Advanced Data Structures

    Advanced Data Structures

    Advanced Data Structures是MIT的高级数据结构教程,为什么会找到这个教程呢?因为Google Advanced Data Structures第一个出来的就是这货。

    这门课包含各种让本屌世界观崩坏的奇诡数据结构和算法,它们包括但不限于:

    • 带"记忆"的数据结构(Data Structure with Persistence)。
    • van Emde Boas(逆天的插入,删除,前驱和后继时间复杂度)。
    • o(1)时间复杂度的的LCA、RMQ和LA解法。
    • 奇幻的o(n)时间复杂度的Suffix Tree构建方法。
    • o(lglgn)的BST。
    • ...

    总之高潮迭起,分分高能,唯一的不足就是没有把它们实现一圈。以后本屌一定找时间把它们一个个撸一遍。

    总结

    从接触算法到现在,大概七年:初学时推崇算法牛逼论,实习后鼓吹算法无用论,读研后再被现实打回算法牛逼论。

    怎么这么像辩证法里的肯定到否定再到否定之否定。

    现在来看,相当数量的鼓吹算法牛逼论的人其实不懂算法的重要性——如果你连用算法解决实际问题的经历都没有,那你如何可以证明算法很有用?而绝大多数鼓吹算法无用论的人不过是低水平码农的无病呻吟——他们从未碰到过需要用算法解决的难题,自然不知道算法有多重要。

    Peter Norvig曾经写过一篇非常精彩的SICP书评,我认为这里把SICP换成算法依然适用:

    To use an analogy, if algorithms were about automobiles, it would be for the person who wants to know how cars work, how they are built, and how one might design fuel-efficient, safe, reliable vehicles for the 21st century. The people who hate algorithms are the ones who just want to know how to drive their car on the highway, just like everyone else.

    MIT教授Erik Demaine则更为直接:

    If you want to become a good programmer, you can spend 10 years programming, or spend 2 years programming and learning algorithms.

    总而言之,如果你想成为一个码农或是熟练工(Code Monkey),你大可以不学算法,因为算法对你确实没有用;但如果你想成为一个优秀的开发者(Developer),扎实的算法必不可少,因为你会不断的掉进一些只能借助算法才能爬出去的坑里。

    以上。

    By Lucida

     

     

    本文转载自:https://www.cnblogs.com/figure9/p/3708351.html

    看完大神的算法学习之路,感觉心潮澎湃,远不能及,却心向往之,后面集中精力学习算法……

    展开全文
  • 【Java算法】斐波那契数列全算法+优化+代码(从入门到发疯)A.背景B.定义C.解法1.递归2.递归+HashMap缓存3.递归+数组缓存4.数组缓存+顺序递推5.顺序递推6.公式解法7.矩阵解法8.矩阵解法+快速幂D.尾声 本文作者: ...
  • 斐波那契数列(二)--矩阵优化算法

    千次阅读 2018-03-08 20:15:06
    之前写了一篇从斐波那契数列分析递归与动态规划(JAVA)来优化斐波那契数列,这样可以使算法的时间复杂度从O(n^2)变到O(n),这是使用递归公式f(n)=f(n-1)+f(n-2)求斐波那契数列的最优算法,但是这只是一维世界下的...
  • Fibonacci数列算法优化
  • 方法一: 递归法 ...递归算法的程序看上去很简洁,但实际上运行起来却不如此,深度的递归会占用很多栈空间,容易造成溢出。另外在递归计算Fibonacci数列过程中有很多重复计算。比如,计算f(5)需要计算f(4),f(3...
  • 题目:斐波那契数列为:1,1,2,3,5,8…,求第n项? 初步分析 设an为斐波那契数列。 a1=a2=1;...以下代码因不同算法而时间复杂度不同个人归类为不同版本,总结如下。 1.尽量不要用递归,纵使好看...
  • 什么是算法

    万次阅读 多人点赞 2016-12-14 10:56:36
    什么是算法 1、什么是算法 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。 mark:我们...
  • A*算法

    千次阅读 2019-07-25 19:34:03
    A*算法 注: 讲解部分来自博客园 Nickname:XXX已失联 作者博客:https://www.cnblogs.com/21207-iHome 原文章:https://www.cnblogs.com/21207-iHome/p/6048969.html Dijkstra算法 迪杰斯特拉(Dijkstra)算法是...
  • 匈牙利算法(简单易懂)

    万次阅读 多人点赞 2018-06-08 19:41:54
    趣写算法系列之--匈牙利算法(点击打开链接):【书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程】匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是...
  • 五大常用算法

    万次阅读 2017-01-12 16:19:57
    五大常用算法
  • 遗传算法适合求解离散问题,具备数学理论支持,但是存在着汉明悬崖等问题.粒子群算法适合求解实数问题,算法简单,计算方便,求解速度快,但是存在着陷入局部最优等问题.蚁群算法适合在图上搜索路径问题,计算开销会大.要将...
  • 算法图解》高清PDF版

    万次阅读 热门讨论 2017-05-14 22:03:27
    算法图解》高清PDF版,像小说一样好看容易理解的算法书籍,适合算法和竞赛入门者学习,书中的示例代码是python。
  • 人脸识别各算法详解

    万次阅读 多人点赞 2020-10-12 18:22:54
    人脸识别各算法详解 最近,由于工作需要,为了找到一款高效的认识识别算法,对各种人脸识别算法都研究了一番,以下记录的是各算法的理论基础。 一.MTCNN 本文章主要介绍MTCNN算法的流程,MTCNN主要由三个框架组成...
  • 智能优化算法简介

    万次阅读 2019-06-05 21:40:36
    智能优化算法: 受人类智能、生物群体社会性或自然现象规律的启发。 主要包括: (1)遗传算法: 模仿自然界生物进化机制 (2)差分进化算法: 通过群体个体间的合作与竞争来优化搜索 (3)免疫算法: 模拟生物免疫系统学习和...
  • Floyd算法详解——包括解题步骤与编程

    万次阅读 多人点赞 2020-04-01 10:30:15
    一、Floyd算法原理 Floyd算法是一个经典的动态规划算法,它又被称为插点法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。Floyd算法是一种利用动态规划的思想...
  • 算法的五大特性

    万次阅读 2018-08-14 10:27:07
    算法一定是为了解决某一个问题产生。一定是可以解决问题的。空谈算法没有意义。 算法的五大特性: 输入: 算法具有0个或多个输入 输出: 算法至少有1个或多个输出 有穷性: 算法在有限的步骤之后会自动结束而不会...
1 2 3 4 5 ... 20
收藏数 3,336,495
精华内容 1,334,598
关键字:

算法