数据结构和算法简介

数据结构和算法

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


数据结构(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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值