算法(初步)

一、算法和算法分析

什么是算法:

对特定问题的求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。

算法的五个重要特性:
  • 有穷性

  • 确定性

  • 可行性

  • 输入

  • 输出

算法设计的要求:
  • 正确性

  • 可读性

  • 健壮性

  • 高效率与低存储

算法效率的度量:

算法的执行时间需要依据该算法所编制的程序在计算机上运行所消耗的时间来度量,一般有两种方法:

事后统计的方法:

很多计算机内部都有计时功能,不同的算法的程序可通过一组或若干相同的统计数据以分辨优劣,例如:time ./a.out,但这种方法有两个缺陷,一是必须先运行依据算法编程的程序,如果程序不满足要求编写程序所耗费的人力物力就浪费了,二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣,因此人们常常采用另一种事前分析法。

事前分析估算的方法:

一个用户高级程序语言编写的程序在计算机上运行所消耗的时间取决于下列因素:

1、依据算法先用何种策略,比如循环操作,可使用函数递归或for、while、do while等循环语句。

2、问题的规模,少量数据的问题求解、大规模数量的问题求解、海量数据的问题求解。

3、书写程序的语言,对于同一种算法,实现的语言级别越高,执行效率就越低。

4、编译程序所产生的机器代码的质量。

5、机器执行指令的速度,相同的编程语言,使用的编译器不同,产生的机器指令就会不同,从而执行的速度就会不同.

总结:同一个算法用不同的语言实现,或者用不同的编译器进行编译,或者不同的计算机上运行,效率均不相同,这表明使用绝对的时间单位衡量算法的效率是不合适的,抛开这些与计算机硬件、软件有关因素,可以认为特定算法“运行工作量”的大小,只依赖于问题的规模,或者说,它是问题规模的函数。

一个算法是由控制结构(顺序、分支、循环等3种基本结构)和原操作(指固有数据类型类型的操作)构成的,则算法时间取决于两者的统合效果,为了便于比较同一问题的不同算法,基本做法是,从算法中选取一种对于 所研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度。因此用算法执行的次数来代表算法的时间复杂度

所以:算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记叙T(n)=O(f(n)),它表示问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐近时间复杂度,简称时间复杂度。

常见的时间复杂度有:
  • O(1)

    • printf("*");

  • O(log2N)/O(logN)

    • for(int i=N; i>0; i/=2)
      {
          printf("*");
      }
  • O(N)

    • for(int i=0; i<N; i++)
      {
          printf("*");
      }
  • O(NlogN)

    • for(int i=0; i<N; i++)
      {
          for(int j=N; j>0; j/=2)
          {
              printf("*");
          }
      }
  • O(N^2)

    • for(int i=0; i<N; i++)
      {
          for(int j=0; j<N; j++)
          {
              printf("*");
          }
      }

注意:一般时间复杂度取的是一种大约情况不会精确到特别详细,也就是不会百分百正确。

最差时间复杂度:

数据的极端排序顺序会让算法执行效率最差的一种情况。

最优时间复杂度:

数据的极端排序顺序会让算法执行效率最优的一种情况。

平均时间复杂度:

数据的排序顺序队伍事物发展规律,算法执行效率接近真实的一种情况。

空间复杂度:

它代表随着问题规模n的某个函数f(n),它表示问题规模n的增大,算法所需要的存储空间增长率,被称为算法的空间复杂度。

通常来说,只要算法不涉及到动态分配的空间以及递归、栈所需的空间,空间复杂度通常为O(1)

例如求第N个斐波那契数,空间复杂度即为O(N)。

注意:对于一个算法,其时间复杂度和空间复杂度往往是相互影响的,需要综合考虑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值