算法
在刚开始接触算法的时候,对算法的理解真的时有点难理解,毕竟这东西也不简单,视频不是看一两遍就能把它看懂了,而是要重复的看。
算法是对特定问题求解步骤的一种描述,它是指令的有限序列。做任何事情都必须事先想好进行的步骤,然后按部就班地进行,才不会发生错误,计算机解决问题也是如此。对于一些常用的算法应该熟记,比如求阶乘、求素数、求是否闰年等算法,在解决实际问题时,可参加已有的类似算法,按照业务逻辑设计出符合自己的算法。一个算法有以下的五个重要特性。1有穷性 2确定性 3可行性 4输入 5输出。以上的五个特性把它理解了,算法这门课程也就简单了。解决一个问题可以有多种算法,那么该怎样判断它们的优劣呢?判断算法优劣的标准很多,这里不做深入讨论,但一个算法除了正确性必须保证外,一个主要指标是它的效率。
算法效率的度量:算法执行的时间是其对应的程序在计算机上运行所需要时间与下列因素有关:1算法本身选用的策略;2书写程序的语言;3编译产生的代码质量;4机器执行指令的速度;5问题的规模;第①条是算法好坏的根本,第②③条要看具体的软件支持,第④条要看硬件的性能。度量一个算法的效率应抛开具体机器的软、硬件环境,而书写程言、编译产生的机器代码质量、机器执行指令的速度都属于软硬件环境。
算法的时间复杂度:一个算法的执行时间大致上等于其所有语句执行时间的总和,对于语句的执行时间是指该条语句的执行次数和执行一次所需时间的乘积。语句执行一次实际所需的具体时间是与机器的速度、编译程序质量、输入数据等密切相关,与算法设计的好坏无关。所以,可用算法中语句的执行次数来度量一个算法的效率。
首先定义算法中一条语句的语句频度,语句频度是指语句在一个算法中重复执行的次数。以下给出了两个n×n阶矩阵相乘算法中的各条语句以及每条语句的语句频度。
T(n)=O(f(n))
上式是Tn= f(n)中忽略其系数的n的最高幂次项,它表示随问题规模n的增大算法的执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。如上算法的时间复杂度T(n)=O(n3)。
算法中所有语句的总执行次数Tn是问题规模n的函数,即Tn= f(n),其中 n的最高次幂项与算法中称作原操作的语句的语句频度对应,原操作是算法中实现基本运算的操作,在上面的算法中的原操作是c[i][j]=c[i][j]+a[i][k]*b[k][j]。一般情况下原操作由最深层循环内的语句实现。
算法的执行时间和存储空间的耗费是一对矛盾体,即算法执行的高效通常是以增加存储空间为代价的,反之亦然。不过,就一般情况而言,常常以算法执行时间做为算法优劣的主要衡量指标。