数据结构笔记第一章 数据结构基本概念

Data Structure Notes

Author : "Carrawayang"
Version : 1.0
Refresh Date 2020.11.26
Description : 
Just record and review some points about Data Structure.
Have mistakes that please correct it yourself.

数据结构的基本概念

1.数据

2.数据元素:

数据的基本单位,一个数据元素可有若干个数据项构成,数据项是不可分割的最小单位

3.数据类型

4.抽象数据类型(ADT[Abstract Data Type]):

数学模型在计算机的一种实现,包括数据对象、数据关系、基本操作,如建立一个有限状态机模型

5.数据结构:数据元素之间的关系称之为结构,数据结构包括三方面:逻辑结构、存储结构、数据运算(程序=算法+数据结构)

6.逻辑结构:数据间的逻辑关系,与数据存储独立,分为线性结构和非线性结构

graph TD 逻辑结构-->线性结构 逻辑结构-->非线性结构 线性结构-->一般线性表 线性结构-->受限线性表 线性结构-->线性表推广 受限线性表-->栈和队列 受限线性表-->串 线性表推广-->数组 线性表推广-->广义表 非线性结构-->非线性表 非线性表-->集合 非线性表-->树形结构 非线性表-->图形结构 树形结构-->一般树 树形结构-->二叉树 图形结构-->有向图 图形结构-->无向图

7.物理结构:数据元素的表示以及关系的表示,主要有:顺序存储、链式存储、索引存储、散列存储

8.算法评估

(1)特性:有穷、确定、可行、输入、输出

(2)时间复杂度:衡量算法随问题规模的增大,算法执行的时间增长的快慢

T(n)=O(f(n)),f(n)为算法运算频度,一般采用最坏情况下的时间复杂度

计算方法:取算法时间增长最快的函数项,忽略其系数

从左到右性能依次降低:

\[O(1)<O(log_2n)<O(n)<O(nlog_2n)<O(n^2)<O(n^3)<O(2^n) \]

单循环体型:

例题1:计算下列程序的时间复杂度

int i,sum	//执行1次
sum=0	//执行1次
for(i=0;i<=n;i++)//int i=0执行1次,i<=n执行n+2次,i++执行n+1次
	sum+=i;	//执行n+1次

时间分析: 该算法执行了3n+6个语句。 假设每个语句执行时间一致,均为常数t。则总时间

\[T=(3n+6)*t \]

随着问题规模n的增大,总时间的增长率与n的增长率一致,所以复杂度为

\[O(n) \]

结论:

复杂度是关于增长率的,所以可以直接忽视常数项

一般可以直接关注循环段基本操作语句

sum+=i;

的执行次数

例题2:

int sum,i;
sum=0;
for (i = 1;i <= n;i=2*i){
sum=sum+i;

时间分析:

\[i 取值:1,2,4,8… \]

\[ \]

满足条件:2^𝑘 ≤ n

\[ \]

K>𝑙𝑜𝑔_2𝑛时, 跳出循环

\[ \]

所以循环体执行次数:⌈𝑙𝑜𝑔_2𝑛⌉ 故时间复杂度为O(logn).

\[\]

多循环体型

两个运算法则:乘法规则(嵌套循环)、加法规则(若干循环)

例题3:

int x,y,i,j;
for(i=1;i<=n;i++)
	x++;
for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
		y++;

两个循环体是独立的,采用加法规则:

\[T(n)=T_1(n)+T_2(n) \]

\[=max(T_1(n),T_2(n)) =O(n^2) \]

例题4:

int i,j,sum;
for (i=1;i<=n;i++)
	for(j=1;j<=n;j=2*j)
		sum=sum+j;

两个循环体是嵌套的,采用乘法规则:

\[T(n)=T_1(n)*T_2(n) \]

\[=O(nlogn) \]

(3)空间复杂度:衡量算法随问题规模的增大,算法所需空间的快慢

S(n)=O(g(n)),算法所需空间的增长率和g(n)的增长率相同

空间复杂度S(n)指算法运行过程中所使用的辅助空间的大小

posted on 2020-11-26 16:02  blueskylabor  阅读(131)  评论(0)    收藏  举报