【数据结构绪论】

著名的计算机科学家图灵将获得者N.Wirth(沃思)教授给出了一个著名的公式:程序 = 算法 + 数据结构。可见算法和数据结构在程序中的重要地位。

一.数据和数据结构

 1.数据

数据:数据是描述客观事物的数字,字符,以及能输入机器且能被处理的各种符号集合;数据是信息的载体,是对信息的一种符号表示,内被计算机识别,存储和加工处理。

数据元素:数据元素是数据的基本单位,是数据集合的个体。(数据元素又可称为元素,结点顶点,记录等)一个数据元素由若干个数据项组成,数据项是有独立含义的最小单位。

数据对象:数据对象是性质相同的数据元素的集合,是数据的一个子集。

综上,数据概念可以归纳如下:
数据特点:
可被计算机接收,加工(能被处理)。

数据构成:
数据元素:组成数据的基本单位(数据集和的个体)
数据对象:性质相同的数据元素的集合(数据集合的子集)

2.数据结构

数据结构:数据机构是相互间存在一种或多种特定关系的数据元素集合,主要研究程序设计中计算机所操作的对象以及他们之间的关系和运算。

可以将数据结构概括为三个方面:数据的逻辑结构,数据的存储结构,数据的运算集合(基本操作)

1.逻辑结构

数据的逻辑结构是指数据元素之间逻辑关系的描述,分为四种基本结构:

集合结构:结构中的数据元素之间除了同属于一个集合的关系外,外任何其他关系
线性结构:结构中的数据元素之间存在一对一的线性关系
树状结构:结构中的数据元素之间存在一对多的层次关系
网状结构(图状结构):结构中的数据元素存在多对多的任意关系

因为集合中关系只有属于和不属于这两种的简单关系,所以逻辑结构可概括如下:
线性结构:线性表,栈,队,字符串,数组,广义表
非线性结构:树,图

   

2.存储结构

又称为物理结构,是逻辑结构在计算机中的存储映像,是数据结构在计算机中的表示;是逻辑结构在计算机中的实现,包括数据元素的表示和关系的表示。

   

逻辑结构与存储结构的关系为:
存储结构是逻辑关系的映像与元素本身的映像。
逻辑结构是数据结构的抽象,存储结构是数据结构的实现,两者总和起来建立了数据元素之间的结构关系。

存储结构的基本组织方式有顺序存储结构和非顺序存储结构(链式存储结构)
顺序存储结构把逻辑上相邻的元素存储在物理位置相邻的存储单元中。他通常借助于数组来实现。
链式存储结构对逻辑上相邻的元素不要求其物理位置相邻,元素间的逻辑关系通过附设的指针字段来表示。

   

3.基本操作

按某种逻辑关系组织起来的一批数据,按一定的映像方式把它们存放在计算机的存储器中,并在这些数据上定义一个运算的集合。也就是说数据的运算是定义在数据结构上的操作,如建立,插入,删除,查找等。每种数据结构都有一种运算的集合。

   

二.算法

 1.算法是规则的有限集合,视为解决特定问题而规定的一系列操作。

2.算法具有以下五个特性

 1.有限性(有穷性):一个算法必须在有限的时间,步骤内结束。                                                2.确定性:算法的每一步必须有确定含义,无二义性。
  3.可行性:原则上精确进行,造作可通过已实现的基本运算执行有限次而完成。
    4.输入:一个算法具有0个或多个输入。
      5.输出:一个算法具有一个或多个输出。

3.算法的设计要求

在设计算法时,要考虑以下几个因素:

正确性:算法的执行结果应当满足预先规定的功能和性能要求
可读性:一个算法应当思路清晰,层次分明,简单明了,易读易懂
健壮性(可读性):一个算法应有对非法输入的抵抗能力。当输入不合法数据时应能做适当处理,避免不良后果
高效性:好的算法能有效的使用存储空间并且具有较高的时间效率

4.算法描述

算法可以用不同方法来描述,常用描述算法的语言是类语言。类语言也就是伪代码,介于高级语言和自然语言之间。它比较接近高级语言,忽略了高级语言中一些严格的语法规则和语法细节。
在进行算法描述,应注意以下要点:

   

  1.加上必要的注释
  2.避免函数返回值隐含说明
    c语言规定函数,参数,外部变量不加类型说明时则隐含为int类型。
  3.预定义常量和类型
    程序中常用到的常量(如TRUE, FALSE等)应用宏定义。
  4.使用有意义的函数名和变量名
  5.避免可能出现的二义性表达
  6.规范多分支转向
    switch语句中的case语句和default语句后应使用break语句,使之规范跳出switch语句。
  7.简化输出输出表述
  8.注意不同退出语句之间的区别
    return:用于函数结束
    break:用于结束循环或跳出switch语句
    continue:用于结束本轮循环,进入下一轮循环
    exit:控制退出程序

   

5.算法的性能评价

算法的性能评价通常从算法的时间复杂度和空间复杂度两方面评价。

算法的时间复杂度T(n)

算法的时间复杂度是该算法的时间度量,记作:  T(n) = O(f(n)) 。它表示随问题规模n的增大,算法的执行时间的增长率和f(n)的增长率相同,也称作算法的渐进时间复杂度(以O表示),简称时间复杂度。(通常将算法的时间复杂度和渐进时间复杂度不予区分)

注意: T(n) = O(f(n)) 中的f(n)一般是算法中频度最大的语句频度(该语句在一个算法中重复执行的次数)。

   

在计算算法的时间复杂度时,还要考虑一种情况,就是程序所给的参数不确定,每种情况的算法的时间复杂度也不一致,因此就要考虑它的最好情况和最坏情况,即耗时最长和耗时最短。大家都知道短板效应,一个桶能装多大水取决于它最短的板子,我们探讨时间复杂度也是一样的。在没有特别说明的情况下,讨论的时间复杂度均是最坏情况下的时间复杂度。最坏情况下的时间复杂度称为最坏时间复杂度。

还有一个是平均时间复杂度,平时用到的不多。平均时间复杂度是指所有可能的输入实例均已等概率出现的情况下,算法的期望运行时间。

我们常用的算法时间复杂度有以下7种:

n

0

1

0

1

1

2

1

2

2

4

8

4

2

4

8

16

64

16

3

8

24

64

512

256

4

16

64

256

5096

65536

5

32

160

1024

32768

2147483648

 

 

算法的空间复杂度

算法的空间复杂度S(n)定义为该算法所耗费的存储空间的数量级,它是问题规模n的函数,记作: S(n) = O(f(n)) 。若算法的执行时间所需要的辅助空间相对于输入数据量而言是一个常数,则称这个算法为原地工作,辅助空间为O(1).

   

 

三.结构化程序设计和函数的模块化

1.结构化程序设计

目的:为了是程序具有合理的结构,保证程序的正确性而规定的一套程序设计的方法。
构成单元:三种基本控制结构,即顺序结构,选择结构,重复结构。利用三种结构,通过组合的方法产生需要的程序控制结构。
方法:
结构化程序的设计概念是E.W.Dijkstra在1969年体术,他强调从程序结构和风格上来研究程序设计问题。同常称为自顶向下法或逐步求精法。
的设计思想;

  一是"自顶向下,逐步求精"

  二是"独立功能,一个入口,一个出口"的模块化结构;

  三是"仅用三种基本控制结构"的设计元素。

   

2.函数模块化

根据结构化程序设计思想,将一个大人物分解成若干个功能独立的子任务,故程序可有一个主函数和若干个子函数构成。那么一个完整的,可执行的c程序文件一般结构如下:

  [包含的头文件语句#include]
  [宏定义语句#define]
  [自定义类型语句typedef]
  [所有子函数的原型说明语句]
  [所有子函数的定义]
  [主函数main]

举个例子:

//头文件 
#include <stdio.h>

//宏定义 
#define M 10 

//自定义类型 
typedef int intNum;

//子函数原型声明 
int toAdd(int i, int j);

//子函数定义 
int toAdd(int i, int j){
    int num;
    num = i + j; 
    return num;
}

//主函数 
int main()
{
    intNum i, j, num;
    scanf("%d%d", &i, &j);
    num = toAdd(i, j);
    printf("num: %d", num);
    return 0;
}

 

 

Thats all  XD

posted @ 2017-02-06 12:00  天秤libra  阅读(435)  评论(0编辑  收藏  举报