数据结构的基础知识

  • 要掌握基本的数据组织和数据处理方法:

各种数据的逻辑结构描述
各种数据的存储结构表示
各种数据结构的运算定义
设计实现运算的算法
分析算法效率

数据结构:

1.带结构的数据元素的集合
2.逻辑结构->存储结构->数据运算
3.根据逻辑结构设计存储结构,根据存储结构设计算法,最后对算法进行分析找出最优的算法

  • 逻辑关系:

集合
线性结构
树形结构
图形结构

算法

  • 算法的定义:

数据元素之间的关系有逻辑关系和物理关系,对应的运算有基于逻辑结构的运算描述和基于存储结构的运算实现。
通常将基于存储机构的运算实现步骤或过程称为算法。

  • 算法的五个重要特性:

有穷性:在有穷步后结束,算法能够停机
确定性:无二义性
可行性:通过基本运算有限次执行来实现,也就是算法中每一个动作能够机械性的被执行
有输入(表示存在数据处理)
有输出

  • 算法的描述:
返回值 算法对应的函数名(形参列表)
{
    //零时变量的定义
    //实现由输入参数到输出参数的操作
    ....
}

返回值:通常为bool值,表示算法是否执行成功
形参列表:由输入型参数和输出型参数构成
C++中使用引用&描述输出型参数

  • 时间复杂度:

事后统计分析方法:编写算法对应程序,统计其执行时间。
但因为程序使用不同的编程语言,不同的编程环境还有其它种种因素不能使用绝对运行时间进行比较。

事前估算分析方法:
1.撇开上述因素,认为算法的执行时间是问题规模n的函数
2.频度(T(n)):求出算法执行原操作的次数,它是问题规模n的函数
3.算法的大致执行时间与T(n)成正比
4.比较不同算法的T(n)大小得出算法执行时间的好坏

T ( n ) = O ( f ( n ) ) T(n) = O(f(n))

时间复杂度只需要求 T ( n ) T(n) 的最高阶
O ( 1 ) < O ( n ) < O ( n l o g 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( n ! ) O(1) < O(n) < O(nlog_{2}n) < O(n^2) < O(n^3) < O(n!)

  • 空间复杂度:

用于度量一个算法在运行过程中临时占用的存储空间的大小
一般也作为问题规模n的函数,采用数量级形式描述,记作:

S ( n ) = O ( g ( n ) ) S(n) = O(g(n))

若一个算法的复杂度为O(1)则将这个算法称为原地工作算法或就地工作算法

空间复杂度分析只考虑零时占用的存储空间

  • 最好、最坏和平均时间复杂度分析:

例题:设计了一个算法(如下代码所示),求 n n 个整数的序列中前i个元素的最大值。分析算法的最好、最坏和平均时间复杂度

int fun(int a[], int n, int i){
    int j, maxi = a[0];
    for(j = 1; j <= i-1; j++){
        if(a[j] > maxi)  maxi = a[j];
    }
    return max;
}

解: i i 的取值范围为 1 1 ~ n n ,求前i个元素的最大值需要比较 i 1 i-1 次:

平均时间复杂度:
T ( n ) = 1 n i n ( i 1 ) = n 1 2 = O ( n ) T(n)=\frac{1}{n}\sum_{i}^{n}(i-1)=\frac{n-1}{2}=O(n)
最好&坏时间复杂度:
W ( n ) = O ( n ) i = n W(n)=O(n)(当i=n时)
B ( n ) = O ( 1 ) i = 1 B(n)=O(1)(当i=1时)

  • 递归算法的时空分析

递归算法是指算法中出现调用自己的成分
递归算法分析也称为变长时空分析
非递归算法分析也称为定长时空分析

void fun(int a[], int n, int k){
    int i;
    if(k==n-1){
        for(i=0;i<n;i++)
            printf("%d\n",a[i]);
    }else{
        for(i=k;i<n;i++)
            a[i]=a[i]+i*i;
        fun(a,n,k+1);
    }
}

时间复杂度:

解:设 f u n ( a , n , 0 ) fun(a,n,0) 的执行时间为 T ( n ) T(n) , f u n ( a , n , k ) fun(a,n,k) 的执行时间为$T1(n,k) -> T(n)=T1(n,0) $
T 1 ( n , k ) = ( n k ) + T 1 ( n , k + 1 ) T1(n,k)=(n-k)+T1(n,k+1)
T ( n ) = T 1 ( n , 0 ) = n + ( n 1 ) + . . . + 1 = n ( n + 1 ) 2 = O ( n 2 ) T(n)=T1(n,0)=n+(n-1)+...+1=\frac{n(n+1)}{2}=O(n^2)
空间复杂度:

解:设 f u n ( a , n , 0 ) fun(a,n,0) 的执行空间为 S ( n ) S(n) , f u n ( q , n , k ) fun(q,n,k) 的空间为 S 1 ( n , k ) > S ( n ) = S 1 ( n , 0 ) S1(n,k)-> S(n)=S1(n,0)
S 1 ( n , 0 ) = 1 + 1 + . . . + 1 = n S1(n,0)=1+1+...+1=n
S ( n ) = S 1 ( n , 0 ) = n = O ( n ) S(n)=S1(n,0)=n=O(n)

猜你喜欢

转载自blog.csdn.net/weixin_42285618/article/details/107704790