数据结构

Posted on 2019-03-20 16:43  金色的省略号  阅读(314)  评论(0编辑  收藏  举报

  

  一、数据是数据对象的集合,数据对象是数据元素(相同性质的)的集合,数据元素是数据项的集合。

  数据结构是带结构的数据元素的集合,DS = (D,R),D是数据元素的集合,R是D上关系的集合。

  数据元素及其相互关系称为数据结构。

  二、数据结构总览:

  数据的逻辑结构与存储结构密切相关,算法设计取决于选定的逻辑结构,算法的实现取决于采用的存储结构。数据结构通过算法实现操作,算法根据数据结构设计程序。逻辑结构是面向问题的,而存储结构是面向计算机的。用数据元素 、数据关系和基本操作,定义一个完整的抽象数据类型。

  1、逻辑结构:是指数据对象中数据元素之间的相互关系。

  逻辑结构分为以下四种:

    ①、集合结构:集合结构中的数据元素除了属于同一个集合外,它们之间没有其他关系。各个数据元素是“平等”的,它们的共同属性是“同属于同一个集合”。

    ②、线性结构:线性结构中的数据元素是一对一的关系。

    ③、树形结构:树形结构中的数据元素存在着一种一对多的层次关系。

    ④、图形结构:图形结构的数据元素是多对多的关系。

         在图形结构中,我们在表示数据的逻辑结构时,要注意以下两点:

           a、将每一个数据元素看做一个结点,用圆圈表示。

           b、元素之间的逻辑关系用结点之间的连线表示,如果这个关系是有方向的,用带箭头的连线表示。

  2、存储结构(也叫物理结构):是指数据的逻辑结构在计算机中的存储形式。

      存储结构,就是如何把数据元素及其逻辑关系存储到计算机中的存储器中存储器主要是针对内存而言的,像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。 

     数据的存储结构应正确反映数据元素之间的逻辑关系,数据元素的存储结构形式有两种:顺序存储和链式存储。

      (1)、顺序存储结构:是把数据元素放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。

      (2)、链式存储结构:把数据元素放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。链式存储结构中,数据元素的存储关系并不能反映其逻辑关系,因此需要一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。

  3、算法,是解决特定问题求解步骤的表述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

  算法的五个基本特性:输入,输出,有穷性,确定性,可行性 

  算法的设计要求,设计良好的算法应满足正确性:算法所做的事情是严格满足问题要求的;可读性:易于理解(相对)、调试及扩展(从工程角度);健壮性:当输入不合理、恶意,或到达边界条件,算法均能正确处理,而不能得到非预期结果或崩溃;高效率:所需计算量和存储空间尽可能小(有时优先级高于可读性)

 1 /* 
 2     换硬币,100元换成1、2、5分硬币50枚
 3 */
 4 #include <stdio.h> 
 5 int main () 
 6 {     
 7     /*
 8  9         i+j+k=50
10         i+2j+5k=100
11         得到
12         j+4k=50,k小于13
13     */
14     int i, j, k;
15     for(k=0; k<13; k++)
16     {
17         j = 50-4*k;
18         i = 50-j-k;
19         printf("%5d%5d%5d\n",i,j,k);
20     }
21     return 0; 
22 } 
换硬币

  算法与程序:算法可以用任何语言表述,而程序必须用计算机能够理解的语言;程序是算法的实现,可用不同编程语言实现同一算法;算法不能被计算机运行,而程序可以;算法必须满足有穷性,而程序可以无限运行下去,比如操作系统

  算法复杂度:解决问题方法的效率, 跟数据的组织方式(逻辑结构、物理存储结构)有关;解决问题方法的效率, 跟空间的利用效率有关;解决问题方法的效率, 跟算法的巧妙程度有关。

 1 /* 
 2     clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。
 3     这个 时间单位是clock tick,即“时钟打点”。 
 4     常数CLK_TCK(或CLOCKS_PER_SEC):机器时钟每秒所走的时钟打点数。 
 5 */
 6 #include <stdio.h> 
 7 #include <time.h>
 8 clock_t start, stop;
 9 /* clock_t是clock()函数返回的变量类型*/
10 double duration;
11 /* 记录被测函数运行时间,以秒为单位*/
12 int main () 
13 {     /* 不在测试范围内的准备工作写在clock()调用之前*/
14     start = clock(); /* 开始计时 */
15     //MyFunction(); /* 把测试函数加在这里 */
16     stop = clock(); /* 停止计时 */
17     duration = ((double)(stop-start))/CLK_TCK;
18     /* 计算运行时间 */
19     /* 其他不在测试范围的处理写在后面,例如输出duration的值*/
20     return 0; 
21 } 
函数运行时间测试模板  

  三、抽象数据类型(Abstract Data Type 简称ADT)

  数据类型,是一个值的集合和定义其上的一组操作。

  抽象数据类型,是指一个数学模型和定义其上的一组操作,通过固有的数据类型表示和实现,用已存在的数据类型说明新的结构,用已实现的操作来组合新的操作。ADT{ 数据对象,  数据关系,  基本操作(初始条件,操作结果) }

  抽象数据类型的三要素:类型名称,数据对象集,操作集。

  抽象数据类型的两个重要特征:数据抽象,数据封装