(001算法)初识算法-时间复杂度

Posted on 2018-09-06 00:31  sir_Lijun  阅读(482)  评论(0)    收藏  举报

一:算法

算法根据数据结构上面描述定义:算法是描述求解问题方法的操作步骤的集合。

二:算法的性质

算法应满足以下性质

  1. 输入性:具有0个或者若干个输入量
  2. 输出性:至少产生一个输出或者执行一个有意义的操作
  3. 有限性:执行语句的序列是有限的
  4. 确定性:每一条语句的含义明确,无二义性
  5. 可执行性:每一条语句都有应在有限的时间内完成

三:算法设计目标

  1. 正确性
  2. 可读性
  3. 健壮性
  4. 高时间效率
  5. 高空间效率

四:算法效率

上面提到高时间高空间效率,都是指算法效率。

  • 时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。 
  • 空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。

设计算法时,根据系统环境,权衡复杂度,在时间与空间选取一个平衡点。但是,时间复杂度要比空间复杂度更容易产生问题,因此算法研究的主要也是时间复杂度。

五:时间复杂度

分析一个算法中基本语句执行次数和数据元素个数N的函数关系,得出该算法时间复杂度T(n)。

案例,我们根据冒泡排序法对数组a中的N个整数类型的数据元素从小到大进行排序,求该算法的时间复杂度。

首先我们看冒泡排序代码:

package com.lj.TN;

import org.junit.Test;

public class arrayDemo {
    
    @Test
    public static void arraySort(int a[]) {
        int n = a.length;
        int i, j, temp, flag = 1;
        for (i = 1; i < n && flag == 1; i++) {
            flag = 0;
            for (j = 0; j < n - i; j++) {
                if (a[j] > a[j + 1]) {
                    flag = 1;
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }

    }

}

 

冒泡排序算法的原理如下:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

我们考虑一个最好的情况与一个最坏的情况:

  1. 那么最好情况,只需要一趟扫描即可完成,比较次数(n-1),移动次数0所以很容易得知空间复杂度为O(n);
  2. 如果是最坏的情况,需要n-1趟排序,每趟排序要进行n-i次(1≤i≤n-1),所以比较次数n(n-1)/2 ,移动次数3n(n-1)/2,所以空间复杂度为O(n^2);