算法概述
算法概念
定义
算法是任何定义良好的计算程式,它取某些值或值的集合作为输入,并产生某些值或值的集合作为输出。因此,算法是将输入转化为输出的一系列计算步骤。
——《算法导论》
算法的五个特征
-
输入:有0个或多个由外部提供的量
-
输出:算法产生至少一个量作为输出
-
确定性:组成算法的每条指令适清晰的,无歧义的
-
可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有 限时间内完成(也称之为有效性)。
-
有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的
程序与算法
程序是算法用某种编程语言的具体实现。
程序可以不满足有限性。例如操作系统是一个在无限循环中执行的程序,因而不是算法。
算法分析
算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。
一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上。(从算法角度来看,计算机资源包括时间资源和空间资源)
时间复杂度
算法的时间复杂性取决于:
(1) 求解问题的规模;
(2) 具体的输入数据;
(3) 算法本身的设计。
1、用怎样的一个量来表示算法的复杂性
答:针对问题选择基本运算,将基本运算次数表示为输入规模的函数
2、给定一个算法,如何计算它的复杂性
答:输入规模为n时,求解最坏情况下的时间复杂度。
空间复杂度
程序p的空间复杂度指该程序运行时所需的内存空间大小,包括:
-
指令空间:存储经过编译之后的程序指令所需的空间。
-
数据空间:常量和简单变量、复合变量(数组、链表、树和图等)
-
环境栈空间(函数调用):复合变量所需空间常常和问题实例特征有关。
渐进分析
为了简化复杂度的分析,当问题规模n很大时,关注时间复杂度增长的阶,忽略时间复杂度中的低阶项和最高阶项的系数。
渐进性分析:考虑时间复杂性增长的阶
渐进上界
定义1(大O符号) f(n)=O(g(n))(读作“f(n)是g(n)的大O”)当且仅当存在正常量c和n0,使当n≥n0时,f(n)≤cg(n),即g(n)为f(n)的上界。
渐进下界
定义2(大Ω符号) f(n)=Ω(g(n))(读作“f(n)是g(n)的大Ω”)当且仅当存在正常量c和n0,使当n≥n0时,f(n)≥cg(n),即g(n)为f(n)的下界。
渐进紧确界
定义3(大θ符号) f(n)=θ(g(n))(读作“f(n)是g(n)的大θ”)当且仅当存在正常量c1、c2和n0,使当n≥n0时,有c1g(n)≤f(n)≤c2g(n),即g(n)与f(n)的同阶。
算法复杂度的分类
多项式复杂度:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
指数复杂度:O(2n)<O(n!)<O(nn)
易解问题——难解问题
-
一个算法是多项式复杂度:“高效”算法。
-
一个算法是指数复杂度:“低效”算法。
-
多项式复杂度的算法,随着规模n的增加,可以通过堆叠硬件来实现,“砸钱”是行得通的;
-
指数复杂度的算法,增加硬件也无济于事,其增长的速度超出了想象力。
工具——STL
STL主要由container(容器)、algorithm(算法)和iterator(迭代器)三大部分构成,容器用于存放数据对象(元素),算法用于操作容器中的数据对象。
标签:复杂度,复杂性,空间,算法,概述,n0,设计,输入 From: https://www.cnblogs.com/life-is-a-mess/p/16984884.html