算法,敲黑板了!!!

算法的概念

算法,具体说来就是有穷规则的集合,规则在这里是指对某一个问题进行求解的序列。我在上一篇博客说到算法是数据结构的配偶,的确,我们可以这样认为。因为判定一个算法好不好,也要看它的数据结构,如果数据结构选得不好,那么这个算法效率就不高。有一个著名的公式是:数据结构+算法=程序。可见这三者之间的关系。而程序也就是算法的实现,是算法的最终解,软件解。

算法有五大特征:

有穷性:

一个算法在执行有限的步骤之后必须结束。理解起来就是有始有终。

确定性

当算法执行完得出的结果必须是确定的,无歧义性。每一个步骤也应该是确切定义的。

可行性

算法中的所有运算都必须精确的实现,

输入性

可以有零个或多个输入。

输出性

至少要有一个输出结果,如果没有输出的话,那么程序就相当于没有执行一样,因为最终结果都没有。

算法的描述

我们知道算法是为了求解问题,最终要用程序来实现。但是用程序来实现那是一种程序的描述形式,不便于人们去互相交流算法,去浏览算法的实现过程。那到底有什么更好的利于人们互相交流、浏览算法的描述形式呢?比如自然语言、流程图、伪代码等等都可以用来算法的描述。

自然语言所示

在这里插入图片描述

流程图所示

在这里插入图片描述

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
伪代码所示

IF 九点以前 THEN

do 私人事务;

ELSE 9点到18点 THEN

工作;

ELSE

下班;

END IF

算法判定标准

算法也有好的,也有不好的。有效率高的,也有效率不高的,那怎么判定它呢?从两个方面。

第一个方面:正确性

给用户反馈的输出结果一定要正确。这是最起码也是最重要的判定标准。
比如一个排序算法,要求对任意n个数据完成排序。这些数据中有整数,有浮点数,还要字符串。而你只能对整数数据完成排序,或者说你只能完成指定几个数据的排序,再多几个数据就不行了。那么很明显,这个算法就不达标。

另一个方面:有效性

谈到有效性,那就是程序执行时间越短越好,内存空间越小越好。这里涉及到算法的时间复杂度和空间复杂度,有效性主要看这两个指标。

时间复杂度

时间复杂度通常表示算法执行的时间单位,是输入数据量n的函数,用T(n)来表示,描述算法执行过程中所需的时间用量与问题规模n之间的函数关系。比如排序10000个数肯定比排序10个数执行时间长一点。执行过程的时间是随排序的数量来进行变化的。
T(n)=执行基本语句的总条数。 每执行一个基本语句相当于一个时间单位。

void show(){
System.out.pringln("Hello,你今天真好看!"); //执行1次
System.out.println("哈哈,谢谢"); //执行1次
}
// f(n) = 1+1 = 2  T(n) = O(1)

T(n) = O(f(n))。
f(n)是运行时间增长率的上界。
大O函数只求T(n)的最高阶,忽略其低阶项和常系数。
这样就简化了T(n)的计算,能很客观很清楚的反映当n很大时,算法的时间性能。

void show(int n){
    for(int i=0; i<n;i++){  //执行n+1次
    System.out.println("Hello,你今天真好看!");//执行n次
    System.out.printlm("哈哈,谢谢");//执行n次
    }
    //f(n)=n+n+n+1=3n+1  T(n) = O(n)   
}

常见时间复杂度有:常数阶O(1)、线性阶O(n)、对数阶O( logN)、平方阶O()和 指数阶O(2^n)。通常认为,具有_常数阶_量级的算法是好算法,而具有_指数阶_量级的算法是差算法。

空间复杂度

空间复杂度是算法对存储空间的需求,是算法执行时所需的占用内存数。通常只计算辅助空间用量,不计算原始数据所占的数。用S(n)来定义。
和时间复杂度一样,也是用大O函数表示。

int i = 1;    //定义一个变量
int j = 2;     //定义一个变量
int z = 3; //定义一个变量
int sum = i+j+z; //定义一个变量
// S(n) = O(1)


int[] nums = new int[n]; //定义n个变量
// S(n) = O(n)

for(int i=0;i<n;i++){  // 定义一个变量
for(int j=0;j<n;j++){   //定义一个变量
  int sum = i+j;    //定义n^2个变量
  System.out.println(sum);
}
}
// S(n) = O(n^2)

下一篇博客请期待

无论是数据结构还是算法,如果我们怀有好奇心具体深入研究它们的话,完全可以它们当作一门科目来系统的进行学习。但我只是临时安排数据结构和算法客串一下,因为我们的最终目标是学会JavaWeb,主角永远是JavaWeb,而它牵扯到很多很多角色,这些角色我们没办法都给它们立传,所以我说的并不详细。只是粗略的介绍一下。但如果我认为某个角色很重要的话,我想是可以立个传的。比如下一个重量级角色——数据库,我想立个传。请期待…

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值