数据结构的基本概念
基本概念和术语
数据(Data)
是客观事实的符号表示。在计算机科学中指的是所有能输入到计算机中并被计算机程序处理的符号总称。
数据分类:
- 数值性数据、非数值性数据
- 输入数据,输出数据,存储数据
计算机软件=程序+文档+数据
数据是指计算机程序执行所用的数据
数据元素
是数据的基本单位,在程序中通常作为一个整体来进行考虑和处理。
一个数据元素可有若干个数据项组成。
数据项
数据项是数据的不可分割的最小单位。数据项是对客观事物某方面特性的数据描述。
数据对象
数据对象(Data Object):是性质相同的数据元素的集合,是数据的一个子集。如字符集合C={‘A’,‘B’,‘C’,‘D’,…}
数据结构
数据结构:是指相互之间具有(存在)一定联系(关系)的数据元素的集合。
逻辑结构
逻辑结构:元素之间的相互联系(关系)
逻辑结构有四种基本类型:
- 集合:结构中的数据元素除了“同属于一个集合”外,没有其他关系。
- 线型结构:结构中的数据元素之间存在一对一的关系。
- 树型结构:结构中的数据元素之间存在一对多的关系。
- 图状结构或网状结构:结构中的数据元素之前存在多对多的关系。
数据结构的形式定义
数据结构的形式定义是一个二元组:Data-Structure=(D,S)
其中:D是数据元素的有限集,S是D上关系的有限集。
例题:
设数据逻辑结构B=(K,R)
K={k1,k2,k3,...,k9}
R=<k1,l3>,<k1,l8>,......<k4,k6>
画出这逻辑结构的图示,并确定那些是起点,那些是终点。
数据结构的存储方式
数据结构在计算机内存中的存储包括数据元素的存储和元素之间的关系的表示。
元素之间的关系在计算机中有两种不同的表示方式:
- 顺序表示和非顺序表示??顺序存储结构和链式存储结构
- 顺序存储结构:用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构(关系)
- 链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指正(pointer),用该指针来表示数据元素之间的逻辑结构(关系)
- 两种不同的存储结构
- 顺序结构:数据元素存放的地址是连续的;
- 链式结构:数据元素存放的地址是否连续没有要求。
数据的逻辑结构和物理结构是密不可分的两个方面,
- 算法的设计取决于所选定的逻辑结构,
- 算法的实现依赖于所采用的存储结构。
在C语言中,
- 用一维数组表示顺序存储结构;
- 用结构体类型表示链式存储结构。
数据结构的三个组成部分:
- 逻辑结构:数据元素之间逻辑关系的描述
- 存储结构:数据元素在计算机中的存储及其逻辑关系的表现称为数据的存储结构或物理结构。
- 数据操作:对数据要进行的运算。
抽象数据类型
抽象数据类型(Abstract Data Type,简称ADT):是指一个数学模型以及定义在该模型上的一组操作
- ADT定义是一组逻辑特性描述
- ADT形式化定义是三元组:ADT=(D,S,P)
- D是数据对象,S是D上的关系集,P是对D的基本操作集。
定义形式:
数据结构的运算
算法定义
算法:是对特定问题求解方法(步骤)的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
特性:
- 输入 有0个或多个输入
- 输出 有一个或多个输出(处理结果)
- 确定性 每步定义都是确切、无歧义的
- 有穷性 算法应在执行有穷步后结束
- 有效性/可行性 每一条运行应通过有限次完成
评价一个好的算法有以下几个标椎:
大O表示法、时间复杂度、空间复杂度
性能分析与度量
算法执行时间须通过依据该算法编制的程序在计算机上运行所消耗的时间来度量。
方法通常有两种:
- 事后统计:计算机内部进行执行时间和实际占用空间的统计。
- 事前分析:求出该算法的一个时间界限函数
时间复杂度度量
- 运行时间=算法每条语句执行时间之和。
每条语句执行时间=该语句执行次数(频度)*语句执行一次所需时间。 - 语句指令执行一次所需时间(
P
?
C
P
A
?
1
/
主
频
P*CPA*1/主频
P?CPA?1/主频)取决于机器的指令性能和速度和编译所产生的代码质量,很难确定。
- 通常设每条语句执行一次所需时间为单位时间,则一个算法的运行时间就是该算法中所有语句的频度之和。
算法中基本操作重复执行的次数是问题规模n的某个函数,其时间量度量度记作
T
(
n
)
=
0
(
f
(
n
)
)
T(n)=0(f(n))
T(n)=0(f(n)),称作算法的渐近时间复杂度(Asymptotic Time complexity),简称时间复杂度。
一般的,常用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示。
“O”的定义
若f(n)是正整数n的一个函数,则O(f(n))表示存在M≥0,使得当n≥n0时,
∣
f
(
n
)
∣
≤
M
∣
f
(
n
0
)
∣
|f(n)|≤M|f(n0)|
∣f(n)∣≤M∣f(n0)∣。
表示时间复杂度的阶有:
- O(1):常量时间阶
- O(n):线性时间阶
- O(logn):对数时间阶
- O(nlogn):线性对数时间阶
- O(n^k):k>2,k次方时间阶
定理
算法的空间分析
空间复杂度(Space complexity):是指算法编写成程序后,在计算机中运行时所需存储空间大小的度量。记作:S(n)=O(f(n)) n为问题的规模(或大小)
- 指令常数变量所占用的存储空间;
- 输入数据所占用的存储空间;
- 辅助(存储)空间。
算法的空间复杂度指的是辅助空间
- 一维数组a[n]:空间复杂度 O(n)
- 二维数组a[n][m]:空间复杂度 O(n*m)
练习
写出100以内的素数,并表示出时间复杂度
时间复杂度为:O(n^2)
#include "stdio.h"
void zhishu(int i);
//
// Created by Administrator on 2022/4/21.
//
int main(){
zhishu(100);
return 0;
}
void zhishu(int i) {
for (int j = 2; j < i; ++j) {
int f = 0;
for (int k = 2; k < j; ++k) {
if(j%k==0){
f = 1;
break;
}
}
if (f==0) {
f = 1;
printf("%d\t", j);
}
}
}
写出100以内的水仙花数,并表示出时间复杂度
时间复杂度为:O(1),常数级
#include <stdbool.h>
#include "stdio.h"
void ShuiXianHuaShu(int);
//
// Created by Administrator on 2022/4/21.
//
int main(){
ShuiXianHuaShu(153);
return 0;
}
/**
* 水仙花数:153 = 1×1×1 + 3×3×3 + 5×5×5
* @param max 最大位
*/
void ShuiXianHuaShu(int target) {
int g=target/100;
int s=target/10%10;
int b=target%100%10;
bool b1 = target == g*g*g + s * s*s + b * b * b;
if (b1) {
printf("%d是水仙花数",target);
}
}
|