精华内容
下载资源
问答
  • 在计算机科学中算法是指什么
    千次阅读
    2020-12-30 06:32:36

    算法定义

    算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

    一个算法应该具有以下七个重要的特征:

    ①有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止;

    ②确切性(Definiteness):算法的每一步骤必须有确切的定义;

    ③输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输 入是指算法本身定出了初始条件;

    ④输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没 有输出的算法是毫无意义的;

    ⑤可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行 的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性);

    ⑥高效性(High efficiency):执行速度快,占用资源少;

    ⑦健壮性(Robustness):对数据响应正确。

    时间复杂度

    计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,时间复杂度常用大O符号(大O符号(Big O notation)是用于描述函数渐进行为的数学符号。更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。在数学中,它一般用来刻画被截断的无穷级数尤其是渐近级数的剩余项;在计算机科学中,它在分析算法复杂性的方面非常有用。)表述,使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。

    大O,简而言之可以认为它的含义是“order of”(大约是)。

    无穷大渐近

    大O符号在分析算法效率的时候非常有用。举个例子,解决一个规模为 n 的问题所花费的时间(或者所需步骤的数目)可以被求得:T(n) = 4n^2 - 2n + 2。

    当 n 增大时,n^2; 项将开始占主导地位,而其他各项可以被忽略——举例说明:当 n = 500,4n^2; 项是 2n 项的1000倍大,因此在大多数场合下,省略后者对表达式的值的影响将是可以忽略不计的。

    更多相关内容
  • 阐述了数学模型、离散数学、组合数学及数论在计算机科学中的应用,为计算机编程、模型建设、数据存储等方面提供了理论支持。关键词: 数学; 计算机科学; 应用;Abstract:Mathematics is an important content in ...

    摘    要:数学是计算机科学中不可忽视的重要内容,其为计算机科学的形成与发展奠定了基础。阐述了数学模型、离散数学、组合数学及数论在计算机科学中的应用,为计算机编程、模型建设、数据存储等方面提供了理论支持。

    关键词: 数学; 计算机科学; 应用;

    Abstract:Mathematics is an important content in computer science,which lays a foundation for the formation and development of computer science. This paper expounds the application of mathematical model,discrete mathematics,combinatorial mathematics and number theory in computer science,which provides theoretical support for computer programming,model construction,data storage,etc.

    Keyword: Mathematics; Computer science; Application;

    1 、数学在计算机科学中的重要性

    数学是一门工具性极强的学科,相对于其他学科来说,其抽象性、逻辑性等特点十分明显。就当前数学的应用来看,其与计算机科学之间有着不可分割的联系。随着互联网技术、人工智能技术的发展,计算机运算性能得到了质的飞跃,计算机的优势也越来越明显,将深奥的数学理论应用到实际问题中,有效解决了现实生活中的各种难题[1]。计算机已经证明了四色问题,证明过程中利用了大量数学思想,如小波分析、离散数学、仿生计算等,人们开始意识到计算机科学与数学之间有着密不可分的关系。计算机的主要任务是进行数据处理、图像处理、程序设计等不同类型的计算,这些工作可以分为数值计算与非数值计算。计算机科学计算步骤如图1所示。

    4bdc90dbd44c4a3e73bfd00e781167ff.png

    可以看出,计算机在解决问题中需要将实际问题转化为程序,建立完善的数学模型,完成对具体问题的抽象化处理。计算机软件编程是以数学模型为基础的,软件编程中的大量理论和技术是应用数学进行描述的。计算机算法的正确性、程序语义以及理论基础都为数理逻辑或模型论。

    图1 计算机科学计算步骤

    8b4afd7ad2ea8b5ef3a9db9ab6b1b723.png

    Fig.1 Computer science calculation steps

    2 、数学在计算机科学中的应用

    2.1、 数学模型在计算机科学中的应用

    数学模型指通过构建符号系统,把对事物系统特点与数量关系的描述以数学形式表现出来。现代科学发展的重要特点之一就是实现科学的数学化,将现实、形象的问题转化为数学模型。随着计算机技术的快速发展及相关产业的成熟,各类软件已应用到社会生产的各个领域,如导航软件、购物软件、新闻软件等都是利用数学模型进行计算机编程,使人们的生产生活更加便捷[2]。当前计算机软件所能处理的问题已经不局限于数学计算领域,而是拓展到用于解决大量非数值计算问题。利用计算机软件编程解决现实问题时,需要将现实问题进行数学化处理,建立基于数值问题的数学模型,即数学方程。针对非数值计算的数学模型建立,则需要通过表、树以及图等相关数据配合数学方程式,建立完善的描述,从而利用计算机进行计算。

    2.2、 离散数学在计算机科学中的应用

    离散数学在计算机科学中的应用十分广泛,主要有以下几个方面:第一,离散数学在数据结构中的应用。计算机数据结构将操作对象之间的关系分为若干种,分别为集合、线性结构、树形结构、图状结构及网状结构。计算机中数学结构研究的主要内容为数据结构的逻辑体系、基础运算等。其中,逻辑体系与基础运算都是离散数学中重要的离散结构与算法思考内容。离散数学中集合论等知识点及关系等都被应用在计算机数据结构中。如集合论中集合由元素组成,元素是世界上的客观事物,关系是建立在集合论基础上的一种特殊集合[3]。第二,离散数学在数据库中的应用。计算机科学中的数据库应用十分广泛,其中关系数据库是计算机数据库中最常见的类型之一。笛卡尔积是离散数学中的基本理论,也是计算机数据库建设的基础理论之一。笛卡尔积理论为计算机关系数据库的建设提供了理论与方法,并为数据技术的发展作出了巨大贡献。关系数据模型以集合代数作为基础,数据逻辑结构是以行列构成的二维表来阐述关系的数据形式。第三,离散数学在计算机编译中的运用。计算机的编译程序相对繁杂,一般计算机编译程序包含词法分析程序、语法分析程序、语义分析程序等,离散数学中的计算机模型知识点中分析了三种计算模型,分别为文法、有限状态以及图灵机,具体理论有语言与文法、带输出的优先级状态、图灵机等。上述离散数学中的理论知识均能够在计算机编译原理的词法分析中找到。可以看出,离散数学是计算机编译原理的重要基础知识。第四,离散数学在人工智能中的应用。在计算机人工智能中逻辑推理是重要的技术支持。逻辑是数学领域中推理的基础,对计算机人工智能技术有着广泛的现实作用。离散数学中的数学推理知识与布尔代数理论为计算机人工智能的早期发展奠定了坚实基础。第五,离散数学在计算机体系结构中的运用。在计算机体系结构中指令系统设计与优化十分关键,指令系统与计算机系统性能之间有着密切关系。指令系统的优化方式众多,一是对指令格式的优化,指令通常由操作码与地址码构成,指令格式优化即为如何利用最短位数来代表指令的操作与地址信息,以便使程序中的指令字长尽可能短[4]。基于这一目的,需要使用哈夫曼的压缩概念,该概念的基本思想为当各类事件发生概率不平均时,采用优化技术对概率最高的事件用最短的位置来标识,对概率较低的事件则使用较长的位置来表示,这就会导致平均位数变短。利用哈夫曼概念创造出哈夫曼树,利用频度对计算机指令系统中的所有指令进行统计,并根据频度从小到大排列,每次选择其中最小两个频度合并为新频度,将其插入未结合的频度中,如此往复直到所有频度完成结合形成根节点。再针对节点向下延伸分支,分别为“1”与“0”。从根结点开始沿线所经过的代码序列为哈夫曼编码,这一编码系列满足指令使用概率低的指令编以长码。

    2.3 、组合数学在计算机科学中的应用

    组合数学是与计算机科学一同发展成熟的,具有综合性、边缘性,即为分析事物发生中可能联系的N种数学理论。相对传统数学而言,组合数学是离散事物之间存在的必然数学联系,如构造性问题、最优化问题等。在组合数学中,技术问题是研究最为成熟的内容之一。计算机科学需要研究算法,对算法的运算与存储单元进行评估,体现了算法在空间与时间上的复杂性。组合数学的具体研究内容包括容斥原理、生成函数与递推关系等,组合数学有力推动了计算机科学的发展,为了判断计算机算法的效率,需要使用该算法解答具有给定的输入时需要多少步。

    2.4、 数论在计算机科学中的应用

    数论也被称为整数论,分为初等数论、解析数论、代数数论及几何数论等分支。代数数论将证书概念推广到一般代数领域中,构建了可除性、素整数等概念。程序设计中应用较为频繁的有代数曲线,如椭圆曲线理论。随着当代计算机科学的发展,数论的应用也愈加广泛,如在计算机方法、代数编码、组合学理论等方面都广泛应用了初等数论研究的一系列成果。数论算法对于计算机程序设计具有较大作用,其中素数问题、素性测试、因子分解、求解同余线性方程等都是计算机程序设计中需要使用的,如基于大素数的密码体系是近年来数论算法的广泛应用之一。

    3 、结语

    数学是一门逻辑性较强的抽象学科,对于计算机科学的发展具有重要作用。数学能够帮助人们建立抽象的逻辑思维,通过举一反三的思维方式进行创新。数学模型、离散数学、组合数学及数论均在计算机科学中得到了广泛应用,为计算机编程、模型建设、数据存储提供了理论支持。

    参考文献

    [1]巴哈尔古力·吾吉.浅谈计算机科学技术在计算机教育中的应用[J].计算机光盘软件与应用,2012,(03):250-251.

    [2]汪荣臻.数学在计算机科学及应用中的作用分析[J].科技视界,2017,(13):163.

    [3]游文杰.计算机科学中的数学──谈计算机专业数学的学习[J].福建师大福清分校学报,2004,(02):16-18.

    [4]周良喆.数学思想及其在计算机科学中的应用[J].智库时代,2017,(09):217-218.

    展开全文
  • 数据结构和算法“针对没有计算机科学学位的人” 关于“数据结构和算法”的自我教育的纲要,由“没有计算机科学学位的人”创建并为“没有计算机科学学位的人”创建。动机核心计算机科学概念(例如“数据结构和算法”...
  • 列举十大计算机经典算法

    千次阅读 2021-07-28 07:33:29
    算法计算机的指令,是计算机必不可少的一部分,算法是一系列解决问题的清晰指令,能够对一定规范的输入,有限时间内获得所要求的输出。算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不...

    算法是计算机的指令,是计算机必不可少的一部分,算法是一系列解决问题的清晰指令,能够对一定规范的输入,在有限时间内获得所要求的输出。算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。说到具体的算法,这里IT培训网列举十大经典计算机算法,从事计算机行业的必备知识,赶快收藏吧!

    b849e399771d3b14e815c587efde64c2.png

    十大计算机经典算法有哪些?

    一、快速排序法

    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 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;若ik,在大于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中顶点对应的距离值

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

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

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

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

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

    九、动态规划算法

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

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

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

    算法步骤:

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

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

    十、朴素贝叶斯分类算法

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

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

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

    以上十大经典计算机算法,是常用的计算机算法指令,掌握这些对今后的算法学习有一定的帮助,学会算法,掌握计算机要领,是从事计算机行业必备的技能。

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

    万次阅读 多人点赞 2018-06-08 13:42:58
    算法一:快速排序法   快速排序是由东尼·霍尔所发展的一种排序...事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以大部分的架构上很有效率地被实现出来。 快速...

    算法一:快速排序法                            

         快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 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 中所有顶点的集合。每一个图中的边,都是两个顶点所形成的有序元素对。(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. 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。                            

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

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

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

     

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

    展开全文
  • 数学与计算机科学中,递归是指在函数的定义使用函数自身的方法。  递归算法是一种直接或者间接地调用自身算法的过程。计算机编写程序,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且...
  • 离散数学在计算机科学中的应用

    万次阅读 多人点赞 2018-02-03 11:56:44
    这次离散数学的最后一题是:利用本学期学到的离散数学的知识阐释其一个软件工程的应用。 下面说说离散数学的应用。 离散数学数据结构的应用 数据结构中将操作对象间的关系分为四类:集合、线性结构、树形...
  • 什么算法

    万次阅读 多人点赞 2016-12-14 10:55:04
    mark:我们可以把所有的算法想象为一本“菜谱”,特定的算法比如菜谱的的一道“老醋花生米”的制作流程,只要按照菜谱的要求制作老醋花生米,那么谁都可以做出一道好吃的老醋花生米。so,这个做
  • 【解析题】机器学习的背景上,人工智能区别于传统计算机的地方就在于人工智能能自主进行(),来揭示数据的内在价值【解析题】计算机网络【解析题】计算机启动后1短报警,请问是以下哪种情况 (...
  • 生活算法

    千次阅读 2020-12-24 12:06:31
    这人不紧不慢,伸出手来说道:“神仙大人,我别的什么也不要,就只要您老刚才点石成金的那根手指头……。”——来自“点石成金”的寓言...这是在中、小学教育的信息科技课程强调生活算法的理由之一。所谓算法,...
  • 算法偏见是什么 在上一篇文章,我们展示了当数据将情绪从动作剥离时会发生什么 (In the last article, we showed what happens when data strip emotions out of an action) In Part 1 of this series, we ...
  • 算法中的大O表示法

    千次阅读 2021-07-28 03:28:17
    1.算法概念计算机科学中算法指的就是计算机执行的指令。算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。一般地,...
  • 什么是数据结构?什么算法

    千次阅读 2019-10-20 22:04:02
    1.从广义上讲,数据结构就是一组数据的...有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。 从狭...
  • 计算机科学核心知识体系

    千次阅读 2020-06-13 11:53:30
    对于计算机科学,数学最相关的领域是“离散数学”,其中的“离散”与“连续”相对立,大致上的是应用数学那些有趣的主题,而不是微积分之类的。由于定义比较含糊,试图掌握离散数学的全部内容是没有意义的。...
  • 数据结构与算法必知基础知识

    千次阅读 多人点赞 2021-01-06 22:58:12
    原创公众号:bigsai 文章已收录 全网都关注的数据结构与算法学习仓库 欢迎star 前言 数据结构与算法是程序员内功体现的重要标准...为什么学习数据结构与算法?如果你还是学生,那么这门课程是必修的,考研基本也.
  • 算法岗和开发岗有什么区别?

    千次阅读 多人点赞 2021-11-10 00:47:12
    链接:https://www.zhihu.com/question/490150407编辑:深度学习与计算机视觉声明:仅做学术分享,侵删作者:如雪https://www.zhihu.com...
  • 点击下方“AI算法与图像处理”,一起进步!...重磅干货,第一时间送达目前的监督学习模型是基于label作为学习目标,那么是否可以添加经典算法(如排序)来作为约束?深度学习可以不断优化,很重...
  • Dijkstra算法c语言程序

    2018-04-25 15:51:10
    迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有向图最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外...
  • 如何从科学论文实现一个算法

    千次阅读 2017-03-27 11:34:09
    作者:Emmanuel Goossaert 本文是从科学论文实现算法的简短指南。我从书籍和科学出版物实现了许多复杂的算法,本文总结了我...这显然仅限于与计算机科学领域有关的领域的出版物。然而,您应该能够将以下提供的
  • 计算机科学前沿热点及发展趋势

    千次阅读 2021-06-17 05:35:14
    人工智能、人工神经网络的研究、遗传算法、逻辑学等领域研究前沿的若干问题,并提出未来计算机科学的发展趋势。关键词:信息技术知识科学智能技术发展趋势短短的60年里,计算机科学发展至今,取得了巨人的成就。...
  • 学院计算机科学与信息学院 专业软件工程 班级 102 班 实 姓名 学号 验组 实验时 成 间 导教师 绩 实验项 实验一 直线生成算法 目名称 实 验 通过本实验了解并掌握光栅显示系统直线的生成和显 目 示算法熟悉...
  • 遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。...遗传算法广泛应用生物信息学、系统发生学、计算
  • 而当水滴空中的坠落速度达到很大时,由于自身体积而产生一个空气阻力,也即空气摩擦阻力,水滴空中就已经雾化了。当然雾化的原因是摩擦生热和水汽蒸发!也即是说水滴速度没有达到能伤人的情.
  • 编程算法同步入门

    千次阅读 2019-05-29 23:30:03
    受过计算机科班教育的人一定上过一门课:数据结构,这门课是计算机科学的基础,它的核心内容就是各式各样的算法,它们是几代计算机科学家从解决现实问题提取出的套路——这些才是编程的核心。 经得起时间考验的通...
  • 提高你计算机科学知识的5本书

    千次阅读 2022-03-17 11:30:37
    推荐几本书,从初学者到高级程序员,每个人都可以从这些书提高自己。 1、算法设计 1.众多名校采用的算法设计课程教材; 2.用实际示例阐明枯燥的算法理论; 3.更注重算法设计思路而非算法复杂度分析; 4.本书...
  • 目前计算机专业的研究方向主要分为四个大方向:分别是:AI(人工智能)、Systems(计算机系统)、Theory(计算机理论)、Interdisciplinary Areas(交叉领域),各个大方向又会有很多具体的研究方向。一、AI(人工智能)方向...
  • 文章目录数据科学的定义数据科学:有待开发的机器学习资源数据科学、人工智能和机器学习有什么...9年前我从数据分析师到算法工程开发,最后到目前的全栈开发,经过无数的项目经历到现在才慢慢懂了什么是 数据科学
  • 原理C2近似算法在计算机科学与运筹学,近似算法用来发现近似方法来解决优化问题的算法。近似算法通常与NP-hard问题相关; 由于不可能有效的多项式时间精确算来解决NP-hard问题,所以一个求解多项式时间次优解。与...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,228
精华内容 28,091
热门标签
关键字:

在计算机科学中算法是指什么