Skip to content
Go back

数据结构概述

Edit page

数据结构

概述

算法+数据结构=程序
数据结构是现实世界中的数据以及其关系的一种反映。他可以从逻辑结构存储结构两个方面进行刻画。

一些基本概念

数据和数据结构

数据(data):数据是能够被计算机处理的符号的总称。
数据元素(data element):数据中的个体,是数据的基本组织单位。又称结点、顶点或记录。
数据项(data item):数据元素的组织单位,数据元素的某一个属性,例如:产品的生产编号、个数、流水线条数等。
数据对象(data object):性质相同的数据元素的集合,例如狗的数据对象,包括了许多狗个体的数据元素,每个数据元素包括品种、年龄、犬型等等数据项。

数据结构(data structure):相互之间存在关系的数据元素集合。我们一般从数据的逻辑结构、存储结构和操作三个方面定义。

逻辑结构:面向用户的数据元素的组织形式,包括

存储结构:面向计算机的数据元素的组织形式,包括

算法(Algorithm)

void SelectSort(int List[], int N){
    for(i = 0; i < N; i++) {
        MinPosition = ScanForMin(List, i, N-1);
        Swap( List[i], List[MinPosition]);
    }
}

算法评价指标:

空间复杂度计算案例

这是一个输出从 1 到 N 的整数的递归程序:

void PrintN (int N){
    if(N){
        PrintN(N-1);
        printf("%d\n", N);
    }
}

每次运行都会保存上一次函数的执行位置上下文,当到达递归底部的时候,占用了 N 个函数上下文的空间,空间复杂度为:S(N)=CNS(N) = C \cdot N.

时间复杂度计算实例

下面是一个计算 n 项式的值的程序1

double f(int n, double a[], double x) {
    int i;
    double p = a[0];
    for (i = 1; i < n; i++) {
        p += (a[i] * pow(x, i));
    }
    return p;
}

每次循环执行了 ii 次乘法(i1i-1 累乘 + 1 次乘法),共 nn 次乘法,总计 n2+n2\frac{n^2+n}{2} 次,时间复杂度为:T(n)=C1n2+C2nT(n) = C_1 n^2 + C_2 n.

常用指标

Tworst(n)Tavg(n)T_{worst}(n) \le T_{avg}(n)

复杂度的渐进表示法

我们研究算法复杂度的时候往往只关注最影响算法效率的项,其他的项则只用一个常数倍来表示。

T(n)=O(f(n))T(n) = \Omicron(f(n)) 表示 n0,C>0\exist n_0, C > 0 使得 T(n)Cf(n),(n>n0)T(n) \le C \cdot f(n),(n > n_0) T(n)=Ω(f(n))T(n) = \Omega(f(n)) 表示 n0,C>0\exist n_0, C > 0 使得 T(n)Cf(n),(n>n0)T(n) \le C \cdot f(n),(n > n_0) T(n)=Θ(f(n))T(n) = \Theta(f(n)) 表示同时有 T(n)=O(f(n))T(n) = \Omicron(f(n))T(n)=Ω(f(n))T(n) = \Omega(f(n))

picture 39

picture 40

复杂度分析技巧

加法法则T1(n)+T2(n)=max(Ω(f1(n)),Ω(f(n))T_1(n) + T_2(n) = \max {\large(} \Omega(f_1(n)), \Omega(f(n) {\large)} 乘法法则T1(n)×T2(n)=Ω(f1(n)×f2(n))T_1(n) \times T_2(n) = \Omega(f_1(n) \times f_2(n))

T(n)T(n)nnkk 阶多项式,那么 T(n)=Θ(nk)T(n) = \Theta(n^k) for 循环中,时间复杂度为 循环次数 nn 乘以 循环体代码复杂度 if-else 中,时间复杂度取决于,条件判断和两个分支中最大的复杂度

常用的时间复杂度大小顺序:

O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1) \lt O(\log_2n) \lt O(n) \lt O(n\log_2n) \lt O(n^2) \lt O(n^3) \lt O(2^n) \lt O(n!) \lt O(n^n)

Footnotes

  1. 这个程序其实写得不好,时间复杂度高,利用秦九韶算法能有效降低算法时间复杂度。


Edit page
Share this post on:

Previous Post
数论知识补充