什么是算法?

算法的定义

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

算法的特性

算法有五大基本特征,即:输入,输出,有穷性,确定性和可行性。
(1) 输入: 一个算法可以有零个或者多个输入;
(2) 输出: 一个算法最起码会有一个或者多个输出;
(3) 有穷性: 它在严格意义上来讲,并不仅仅是数学意义上无穷的对立,它是指程序在人们可以接受的时间范围内完成,如果一个程序陷入了无限循环,或者一个算法需要运算几十年,那都算无穷,那都是没有意义的算法;
(4)确定性: 算法的每一个步骤都具有确定的意义,不会出现多重含义,算法在一定的条件下,只能有一条执行路径;
(5) 可行性: 算法的每一步都必须是可执行的,也就是说,每一步都能够通过执行有限次数完成。

算法设计的要求

我们都知道,想要实现某种目的,我们可以设计多种多样的算法去实现,但是一个好的算法,他一般都满足以下的特点。
正确性: 算法至少应该具有输入,输出和加工处理无歧义,能正确反映问题的需求,能够得到问题的正确答案。它主要包括四个层次:1、没有语法错误。2、对于合法的输入,能够给出满足要求的输出。3、对于错误的输入,能够给出相应规格提示的输出。4、对于各种刁难的输入,也能给出满足要求的输出。
可读性: 算法设计的另一目的是为了便于阅读,理解和交流。对于一个优秀的算法而言,它不仅仅要求是解决这个问题,它还要求别人能够理解,这样也有利于算法问题的发现以及改进,同时更是方便自己以后回来再看的时候能够明白。
健壮性: 能够对错误的数据进行正确的相应处理,而不是输出一些稀奇古怪的东西。
时间效率高并且储存量低: 这个其实就是评判算法好坏最关键的一点,也是从事优化算法行业的人最高的追求。就和人们在现实生活中一样,我们总是想用最少的投入,获得最大的收益。那么一款优质的算法也是一样,它讲究用最快的时间,最少的空间,去完成最多的任务。

算法效率的度量方法

对于一个算法的效率,我们应该怎么度量呢?它主要分为两种:事后统计方法和事前分析估算方法。

事后统计方法: 这种方法主要是通过设计好程序,再测试程序和数据,利用计算器对不同算法编制的程序的运行时间进行比较,从而判断算法的效率。这种方法的缺陷很明显。我觉得主要有以下几点:
->有可能导致花费了大量时间去写一个程序,最后运行了发现是一个很糟心的程序 。
->比较的方式有误,运行时间不仅仅是取决于算法的好坏,同时也取决于电脑配置的好坏,你用同样的算法在最先一代电脑上运行和在现在最旗舰的电脑上运行,效果肯定存在巨大差异。
->测试数据存在选择问题,你不知道自己的算法应该选取多大的数据,就那排序算法来说,几个数字的排序,无论哪一种算法,其实都差不多,只有当数据非常大的时候才会有明显差异。

事前估算分析方法: 它的意思是,在编译之前,就依据统计方法对算法进行估算。那么这个估算主要是在哪些方面呢?
->算法采用的策略,方法。
->编译产生的代码质量。
->问题的输入规模。
->机器执行指令的速度。
第一条当然是算法好坏的根本,第二条是由编译器决定的,第四条需要看电脑的性能,也就是说,不考虑软件和硬件,一个程序的运行时间其实是取决于算法的好坏和问题的输入规模(即输入量的多少)。

时间复杂度与空间复杂度

时间复杂度: 我们通常用O(x)来表示时间复杂度,它的意思是在最坏的条件下,这个程序会运行多少次。

我们通常将推导时间复杂度的过程叫做,推导大O阶。把n^2,称为平方阶,把n称为线性阶。如果是lg(n)呢?没错,就是对数阶了。

在推导的过程当中,我们应该注意的是:

如果这个n为一个常数,我们统一认为时间复杂度是O(1)。
如果n的前面存在系数,我们统一认为时间复杂度是O(n),即把前面的系数当成1处理。
如果最终算出时间复杂度为O(n^2+n-i)的类似形式,我们只保留最高阶。

空间复杂度 : 既然已经有了时间复杂度的基础,那么空间复杂度也就不难理解了。而且如果出现了复杂度,在通常情况下,都是指的时间复杂度。

我在这里就不多加介绍空间复杂度了。我们直接写出空间复杂度的表示方法。S(n)=O(f(n)),这里n是问题的规模,f(n)是关于n所占储存空间的函数。

文章来源于程序猿声,作者向柯玮

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值