前言
本期我们所要学习的内容是数据结构与算法中的算法的相关内容,通过上期我们学的数据结构想必大家都会了吧,在学习完毕之后算法,我想你已经可以编写出比较优秀的代码了,著名计算机科学家沃思曾提出一个公式 程序=数据结构+算法。双剑合璧,天下无敌!
目录
前言
目录
一、算法的概述
1.1 算法概述
1.2 什么是算法
1.2.1 算法的概念
1.2.2 算法的特性
1.2.2.1 输入和输出
1.2.2.2 有穷性
1.2.2.3 确定性
1.2.2.3 可行性
1.2.3 算法设计的要求
1.3 算法分析
13.1 算法的效率
1.3.2 算法分析的方法
1.3.2.1 事先分析估算法
1.3.2.1 事后统计法
1.4 案例
总结
一、算法的概述
1.1 算法概述
著名计算机科学家沃思曾提出一个公式: 程序=数据结构+算法 。算法是数据结构的灵魂,一个数据结构设计得再好,如果没有算法,如同失去灵魂的人,它的存在就毫无意义。将算法与数据结构结合起来,才能对数据结构进行各种运算操作。
1.2 什么是算法
1.2.1 算法的概念
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。算:计算
法:方法
计算实物的方法。
张三打算出去作案,可以使用多种交通工具如:汽车、火车、自行车、电车、飞机、地铁。每种出行的方法可以看做一个算法。
1.2.2 算法的特性
算法具有 5 个基本特性: 输入、输出、有穷性、确定性和可行性 。
1.2.2.1 输入和输出
算法具有零个或多个输入。算法至少有一个或多输出。 算法是要有输出的,没有输出,算法就没有意义。输出的形式可以是打印输出,也可以是返回一个或多个值。
1.2.2.2 有穷性
有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
1.2.2.3 确定性
确定性指的是算法的每一步骤都具有确定的含义,不会出现歧义。
1.2.2.3 可行性
可行性:算法的每一步都必须是可行的,即每一步都能通过执行有限次数完成。
1.2.3 算法设计的要求
在进行算法解决问题时,不用的算法质量的优劣程度直接决定着程序运行效率,设计一个好的算法应该满足五点:正确性、可读性、健壮性、时间效率高和存储量低。
1.3 算法分析
13.1 算法的效率
设计算法要尽量的提高效率,这里 效率高一般指的是算法的执行时间 。
1.3.2 算法分析的方法
我们如何来度量一个算法的执行时间?我们可以使用两种方法来进行:事先分析估算法
和事后统计法。
1.3.2.1 事先分析估算法
事前分析估算方法: 在计算机程序编写前,依据统计方法对算法进行估算。
程序在计算机上运行时所消耗的时间取决于下列因素:
(1)算法采用的策略,方案。
(2)编译产生的代码质量(软件)。
(3)问题的输入规模。
(4)机器执行指令的速度(硬件)。
抛开计算机软件、以及计算机硬件的因素,一个程序的运行时间依赖于算法的好坏和问题的输入规模。例如:求10的阶乘和求1000的阶乘计算的数据规模是不同的。
1.3.2.1 事后统计法
事后统计法: 这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
事后统计法存在很大的缺陷:
(1)必须依据算法事先编制好测试程序,通常需要花费大量时间和精力。
(2)不同测试环境差别不是一般的大!
(3)算法的此时数据设计困难,并且程序的运行时间还与测试数据的规模有关。
1.4 案例
张三今天闲得无聊,就回想起自己上小学的时候,老师给同学们出了个问题,从1+2+3+...100等于多少呀?张三为了得到同学们的夸赞,差点把手指头掰断才算出这个题目,现在我们可以使用自己学到过的C语言的知识对这个题目进行编程!
#include <stdio.h>
int main(){
int i,sum=0;
for(i=1;i<101;i++){
sum+=i;
}
printf("sum=%d",sum);
}
我们可以对主要执行的代码进行分析,从int 开始算程序执行了1次,循环里边的sum执行100次,printf执行了1次,可以估算大约执行了 102次。
#include <stdio.h>
int main(){
int i,sum=0;
sum=(1+100)*100/2;
printf("sum=%d",sum);
}
然而当我们学习了等差数列求和公式之后,我们就可以使用三条语句求出该问题。
总结
本期就到此结束了,本期主要的学习目标就是记住算法的相关概念(在应试考试中一定会考的),下期我们主要学习的是如何分析代码的运行效率,以及对算法复杂度的定义。我们下期再见!