代码改变世界

数据结构第一讲:什么是数据结构

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)?

  • 数据类型

      数据对象集

      数据集合相关联的操作集

  • 抽象:描述数据类型的方法不依赖于具体实现

      与存放数据的机器无关

      与数据存储的物理结构无关

      与实现操作的算法和编程语言均无关

它只描述数据对象集和相关操作集"是什么",并不涉及"如何做到"的问题。