数据结构与算法2-算法

2020-04-02  本文已影响0人  fuaiyi
算法是解决问题的一种方法。例如高斯的高斯公式,计算面积的公式等。都是一种算法,用来解决某些问题。

算法特性

算法效率衡量方法

时间复杂度(大O表示法)

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。

推导大O阶方法
常见的算法复杂度
//1常数阶   执行3次。O(1)
void testNum1(int n){
    int sum = 0 ;//执行一次
    sum = (n+1)*n/2; //执行一次
    printf("sum=%d\n",sum);//执行一次
}
//x=x+1; 执行n次 O(n)
void add2(int x,int n){
    for (int i = 0; i < n; i++) {
        x = x+1;
    }
}
//x=x+1; 执行n*n次 ->O(n²)
void add3(int x,int n){
    for (int i = 0; i< n; i++) {
        for (int j = 0; j < n ; j++) {
            x=x+1;
        }
    }
}
/* 2的x次方等于n x = log2n  ->O(logn)*/
void testA(int n){
    int count = 1;         //执行1次
    //n = 10
    while (count < n) {
        count = count * 2;
    }
}
void testB(int n){
    int sum = 1;                         //执行1次
    for (int i = 0; i < n; i++) {        //执行n次
        for (int j = 0 ; j < n; j++) {   //执行n*n次
            for (int k = 0; k < n; k++) {//执行n*n*n次
                sum = sum * 2;          //执行n*n*n次
            }
        }
    }
}
void testA(int n){
    int count = 1;         //执行1次
    //n = 10
for (int i = 0; i< n; i++) {
        while (count < n) {
        count = count * 2;
        }
    }
}
image.png
      0(1) < 0(logn) < 0(n) < O(nlog n) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn) 
最坏情况与平均情况

我们查找一个有n个随机数字数组中的某个数字,最好的情况是第一个数字就是,那么算法的时间复杂度为O(1),但也有可能这个数字就在最后一个位置,那么时间复杂度为O(n)。
平均运行时间是期望的运行时间。
最坏运行时间是一种保证。在应用中,这是一种最重要的需求,通常除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

空间复杂度

空间复杂度就是运行某一个算法,需要多少额外的辅助空间来进行这个算法的运行。
算法的空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
如果算法执行时所需要的辅助空间相对于输入数据量是一个常数,则成这个算法原地工作,辅助空间为O(1).

int temp = a;
a = b;
b = temp;

消耗了额外的一个变量,即空间复杂度为O(1)

int a[n] = {0};//n为常数
for(int i = 0; i < n;i++){
    a[i] = array[n-i-1];
}
for(int i = 0; i < n; i++){
    array[i] = a[i];
}

消耗了额外的n个空间的数组,即空间复杂度为O(n)

常用算法
排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度
冒泡排序 O(n2) O(n2) 稳定 O(1)
快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n)
选择排序 O(n2) O(n2) 稳定 O(1)
二叉树排序 O(n2) O(n*log2n) 不一顶 O(n)
插入排序 O(n2) O(n2) 稳定 O(1)
堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1)
希尔排序 O O 不稳定 O(1)
上一篇 下一篇

猜你喜欢

热点阅读