数据结构第一讲:什么是数据结构
2015-05-04 09:04 星星之火✨🔥 阅读(1056) 评论(0) 编辑 收藏 举报参考:浙大数据结构(陈越、何钦铭)课件
数据结构定义?
官方统一定义——没有......
- 数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。——Sartaj Sahni
- 数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现。——Clifford A·Shaffer
- 数据结构(data structure)是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。——中文维基百科
例一:如何在书架上摆放图书?书架很大书很多怎么办?和数据的规模相关。
图书摆放要使得2个相关操作方便实现:
1.新书怎么插入?
2.怎么找到某本指定的书?
思考三种方法:1.随便放
2.按字母顺序
3.划分区域,每个区域放指定类别的书,每种类别里,按字母。
考虑这三种方法对应的两个基本操作是什么(移空位?遍历?二分?)?对于最后一种方法,空间如何分配?类别应该分多细?
这个问题启示我们:解决问题方法的效率,跟组织数据的方式有关。
例二:写程序实现一个函数PrintN,使得传入一个参数正整数N后,能顺序打印1到N的全部正整数。考虑两种不同的实现方式,循环和递归。
注意到当输入规模过大的时候递归有什么缺陷?爆栈?
这个问题启示我们:解决问题方法的效率,跟空间的利用效率有关。
例三:写程序计算给定多项式∑(k:0~n)AkXk在给定点x处的值
注意到对于这个问题,我们可以用一个循环,一次求一个式子的值,可以利用pow函数,但是其效率低下,可以转而考虑另一种方式
∑(k:0~n)AkXk = A0 + x(A1 + x(...(An-1 + x(An))...))
额外的,关于如何测试程序运行时间,有一个好的办法,如下:
/*
clock(): 捕捉从程序开始运行到clock()被调用时所耗费的时间, 这个时间单位是clock tick, 即"时钟打点"
常数CLK_TCK(或CLOCKS_PER_SEC): 机器时钟每秒所走的时钟打点数
*/
#include<stdio.h>
#include<time.h>
clock_t start, stop; // clock_t是clock()函数返回的变量类型
double duration; // 记录被测函数运行时间, 以秒为单位
int main()
{
// 不在测试范围内的准备工作写在clock()调用之前
start = clock(); // 开始计时
MyFunction(); // 被测函数
stop = clock(); // 停止计时
duration = ((double)(stop - start)) / CLK_TCK; // 计算运行时间
// 其他不在测试范围的处理写在后面, 例如输出duration的值
return 0;
}
/*
如果被测函数运行太快, 以至于它都不到一个时钟打点数, 将会导致输出结果为零
解决方法就是让被测函数重复运行多次(比如一百万次), 使得测出的总的时钟打点间隔充分长
最后计算被测函数平均每次运行的时间即可
*/
这个问题启示我们:解决问题方法的效率,跟算法的巧妙程度有关。
那么问题就来了,正如文章开头提到的那样,到底什么是数据结构???
- 数据对象在计算机中的组织方式
逻辑结构
物理存储结构
- 数据对象必定与一系列加在其上的操作相关联
- 完成这些操作所用的方法就是算法
什么又是抽象数据类型(Abstract Data Type)?
- 数据类型
数据对象集
数据集合相关联的操作集
- 抽象:描述数据类型的方法不依赖于具体实现
与存放数据的机器无关
与数据存储的物理结构无关
与实现操作的算法和编程语言均无关
它只描述数据对象集和相关操作集"是什么",并不涉及"如何做到"的问题。