数据结构和算法简介

    科技2025-04-18  5

    数据结构和算法

    数据结构和算法是不可分割的关系,数据结构是程序的基础,算法将数据互相联系起来,形成一套能解决问题的方案。 程序 = 数据结构 + 算法 在解决问题时,一般会优先确定数据结构,然后再来完善算法。


    数据结构(Data Structure)的分类

    有两类数据结构:

    如果数据元素不能再分,则称为原子项;如果数据元素由若干个数据项组成,则称为组合项。

    数据结构有两个要素:一个是数据元素的集合,另一个是关系的集合。 数据结构按数据元素之间关系的不同,可分为以下四种基本结构:

    集合结构。数据元素属于同一个集合。线性结构。数据元素之间存在着一对一的关系,常见的有链表、队列、栈等。树形结构。数据元素之间存在着一对多的关系,常见的有二叉树、二叉查找树、平衡二叉树等。图形结构。数据元素之间存在着多对多的关系。

    数据结构按照存储方式的不同,可以分为顺序存储结构和链式存储结构,具体如下:

    顺序存储结构,表示数据元素在存储器中是连续存储的,可以用相对位置表示数据元素的逻辑结构,如顺序表、队列、栈等。链式存储结构,每个数据元素里设置了一个指针指向另一个元素的存储地址,以此来表示数据元素之间的逻辑结构。

    算法(Algorithm)简介

    算法有以下5个特征:

    有穷性:算法必须在执行有限个操作后终止。确切性:算法的每个操作必须有明确的定义。输入项:有零个或多个输入,描述算法的初始状态。输出项:有一个或多个输出,没有输出的算法是没有意义的。可行性:算法的每个计算操作都可以在有限时间内完成。

    算法的复杂度

    算法的复杂度是评估算法性能优劣的重要指标。 算法的复杂度分空间复杂度和时间复杂度

    时间复杂度

    时间频度:算法中语句的执行次数,用T(n)表示,n为问题的规模

    时间频度的表达方式有点复杂,故引入时间复杂度的概念,具体如下:

    若一个辅助函数f(n),在n趋向无穷大时,T(n)/f(n)的极限为不等于0的常数,则我们近似地将f(n)替代T(n),记为T(n)=O(f(n)),称为算法的渐进时间复杂度

    时间复杂度最关心算法中最耗时的部分,舍去常数部分,通常用简单的函数来表示:

    常数阶对数阶线性阶线性对数阶平方阶立方阶指数阶阶乘阶O(1)O(logn)O(n)O(nlogn)O(n2)O(n3)O(2n)O(n!)

    以下程序的T(n)=n2+n+logn,取其中最耗时的部分,则时间复杂度为O(n2),代码如下:

    for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { a++; } } for (int i = 0; i < n; ++i) { b++; } while (n) { n = n / 2; }

    空间复杂度

    算法的空间复杂度是指运行该算法所占用的存储空间大小,记为S(n),和时间复杂度类似,通常也取其渐进时间复杂度。 如下代码,可以计算S(n)=n+n2,其空间复杂度为O(n2):

    int *a = new int[n]; int **b = new int*[n]; for (int i = 0; i < n; ++i) { b[i] = new int[n]; }
    Processed: 0.014, SQL: 8