数据结构-笔记(第一章)

来源:互联网 发布:云像数字 知乎 编辑:程序博客网 时间:2024/05/17 08:06

数据结构与算法—–C语言版

第一章

数据结构与算法的简介

一.数据结构

1.1.1什么是数据结构
1 数据:
(定义)数据是指能直接输入到计算机中,被计算机处理的符号或被计算机操作的对象。数据不仅包括整型,实型。等数值数据也包括声音,视频,图像非数值数据。
(俩个必备条件)
A 能直接从计算机输入
B能被计算机直接处理
2 数据元素
A数据元素是数据结构的基本的独立单位,它也被叫作,元素,结点,记录等。
B数据元素往往是由数据项组成的,数据项是具有独立单位含义的最小的标识单位。
3数据对象
A数据对象是性质相同的数据元素的集合。
其中性质相同是指具有相同的数量和类型的数据项。

—————————————

1.1.2数据结构的分类
(定义)数据结构是相互之间存在的一种或多种关系的数据元素的集合。
俩种关系包括:逻辑关系与存储方式
A逻辑关系又称为逻辑结构:描述元素之间的逻辑关系。
B存储方式描述的是数据元素与数据元素之间的关系。
“在计算机中存储结构也被称为物理结构”。
逻辑结构
1 集合
所有元素都属于集合
2线性结构
A线性结构中的元素是一对一的关系。
B线性结构分为{
顺序存储
链式结构
}
3树形结构
数据元素存在着一对多的关系,除了根节点外,每一个结点必须有且只有一个前驱结点。但可以有任意多个后继结点。
4图形结构
元素之间存在着多对多的关系,每一个元素的前驱节点和后继结点可以是任意多个。
存储结构
1)顺序存储
顺序存储是逻辑上把逻辑上相邻的结点存储在地址连续的存储单元里,数据元素之间的关系由存储单元是否相邻来体系的。
顺序存储的逻辑结构与物理结构是一致的。

  • 优点 :可以提高空间的利用率,而且对于随机访问的元素,其效率非常地高。
  • 缺点:对于元素的插入和删除效率非常低。

2)链式存储
链式存储在空间上不连续的存储单元,这些存储单元的逻辑关系通过附加指针字段来表示。 一般而言链式存储在内存分配的单元元素是不连续的。

  • 优点:插入和删除元素的效率比较高
  • 存储元素时没有空间上限制
  • 缺点:空间的利用率比较低 ,
  • 无法进行元素的随机访问

3)索引存储结构
主要是方便查找元素,他它通常在存储结点信息的同时,还建立附加的索引表,索引表中的每一项称为索引项,
索引项由俩个字段组成 关键字和地址。其中关键字唯一标识一个结点,地址是指向结点的指针。
索引表一个索引项对应一个结点,叫做稠密索引。若果索引表中一个索引项对应一组结点叫做稀疏索引。
1. 优点:可以快速的对数据进行随机访问。
2. 缺点:索引存储结构在建立结点时会额外分配空间来建立一个索引表,降低了空间的利用率。
4)散列存储结构 又称为 哈希存储
它是一种力图将元素之间的存储位置与关键字之间建立确定的关系的查询技术。
散列存储的访问是非常地迅速的。

1.2抽象的数据类型

抽象数据类型是指一个数学模型以及定义在这个模型上的一组操作。抽象数据类型的定义仅仅取决于它的一组逻辑特性,而在计算机中的表示和实现无关。
抽象数据的俩种特性:A 数据抽象 B 数据封装
A数据抽象是指用ADT描述程序处理的实体时,强调的是其本质的特征。例如 int类型的数据指的是整数,可以进行加减乘除模的运算,int类型数据的这些数学特性是保持不变的。
B所谓数据的封装是用户在软件设计时从实际问题出来的逻辑数据结构和逻辑数据结构上的运算。需要通过固有的高级的数据类型来实现。它在定义时必须给出名字及其能狗进行的运算操作。
二 抽象数据的细分类
1 原子类型
这种类型的变量,值是不可分解的。
2 固定聚合类型
其值是有确定数目的成按一定的结构组成
3可变聚合类型
与2相比其构成可变聚合类型值的成分是数目不确定的

1.3 算法

什么是算法?
答: 算法是解决特定问题的步骤描述。通俗的讲就是描述问题解决的步骤方法。
算法的三种的标识方法
3. 伪代码法
4. N-S结构化流程图
5. 流程图法
1.3.2
算法的特性
1. 确定性
2. 可行性
3. 有穷性
4. 输入
5. 输出
想要写出一个好的程序其算法必须具备以下几点
1. 正确性
2. 可读性
3. 健壮性
4. 高效率与低存储
(效率是指算法的执行时间)
1.3.3算法的复杂度
时间复杂度
一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记作T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。算法中的基本运算(最深层循环内的语句)的频度与T(n)同数量级,所以通常釆用算法中基本运算的频度 f(n)来分析算法的时间复杂度。因此,算法的时间复杂度也记为:
T(n)=O(f(n))

上式中“O”的含义是T(n)的数量级,其严格的数学定义是:若T(n)和f(n)是定义在正整数集合上的两个函数,则存在正常数C和n0,使得当n>=n0时,都满足0 <= T(n) <= C * f(n)。

注意:取f(n)中随n增长最快的项将其系数置为1作为时间复杂度的度量。例如,fi(n) = a * n3 + b * n2 + c * n,则其时间复杂度为O(n3)。

算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入数据的性质(如输入数据元素的初始状态)。

例如:在数组A[0…n-1]中,查找给定值K的算法大致如下:

i=n-1;while( i>=0 && (A[i]!=k) )    i--;  // 语句(3)return i;

此算法中的语句(3)(基本运算)的频度不仅与问题规模n有关,还与输入实例中A 的各元素取值及K的取值有关:

若A中没有与K相等的元素,则语句(3)的频度 f(n)=n。若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。

最坏时间复杂度是指在最坏情况下,算法的时间复杂度。

平均时间复杂度是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。

最好时间复杂度是指在最好情况下,算法的时间复杂度。

一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。

在分析一个程序的时间复杂性时,有以下两条规则:

a) 加法规则
T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n), g(n)))

b) 乘法规则
T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O( f(n) * g(n) )

常见的渐近时间复杂度有:
O(1)

总结

本章的重点是分析程序的时间复杂度。一定要掌握分析时间复杂度的方法和步骤,很多同学在做题时一眼就能看出程序的时间复杂度,但就是无法将其推导过程规范地表述出来。为此,编者查阅众多资料,总结出此类题型的两种形式,供大家参考:
一是循环主体中的变量参与循环条件的判断。
此类题应该找出主体语句中与T(n)成正比的循环变量,将之带入条件中进行计算。例如:

// 程序①int i=1;while (i<=n) i=i*2;   // 程序②int y=5;while((y+1)*(y+1)<n)y=y+1;

程序①中,i乘以2的次数正是主体语句的执行次数T(n),因此有2T(n)<=n,取对数后,即得 T(n)<=log2n。

程序②中,y加1的次数恰好与T(n)成正比,则令T(n)=y-5,即y=T(n)+5,(T(n)+5+1) *(T(n)+ 5+1)

原创粉丝点击