数据结构初步认识

数据结构说白一点就是一组数据用储存结构和逻辑结构储存起来的架构吧当然还包括其运算结构(此架构非彼架构(⊙o⊙)哦)。

下面就介绍一下一些基本概念吧:

1.数据

数据(Date)是外部世界信息的载体。它能够被计算机识别、存储和加工处理,是计算机程序的加工的原料。计算机程序处理各种各样的数据,可以是数值数据,如整数、实数或复数,主要用于工程计算、科学计算和商务处理等;也可以是非数值数据,如字符、文字、图形、图像、声音等。

2.数据元素和数据项

数据元素(Data Element)是数据的基本但闻,在计算机程序中通常作为一个整体进行考虑和处理。数据元素有时也被成为元素、结点、顶点、记录等。

一个数据元素可由若干个数据项(Data Item)组成。数据项是不可分割的、含有独立意义的最小数据单位。数据项有时也被称为字段(Field)或域(Domain)。例如,在数据库信息处理系统中,数据表的一条记录就是一个数据元素。这条记录中的学生学号、姓名、性别、籍贯、出生年月日、成绩等字段就是数据项。

数据项分为两种。一种叫做初等项,如学生的性别 籍贯等,在处理时不能再进行分割;另一种叫做组合项,如学生的成绩,它可以再分为数学、物理、化学等更小的项。

3.数据对象

数据对象(Data Object)是性质相同的数据元素的集合。它是数据的一个子集,具有相同性质的数据元素的集合。在某个具体问题中,数据元素都具有相同的性质,属于同一数据对象,

数据元素是数据元素类的一个实例。例如,整数数据对象是{0,1,2,3,·······},字符数据对象是{a,b,c,d,······}。在交通咨询系统的交通网中,所有的顶点是一个数据元素类,顶点A和顶点B各自代表一个城市,是该数据元素类中的两个实例,其数据元素的值分别为AB

4.数据类型

数据类型(Data Type)是高级程序设计语言中得概念,是数据的取值范围和对数据进行操作的总和。数据类型规定了程序中对象的特性。程序中的每个变量、常量或表达式的结果都应该属于某种确定的数据类型。例如,C语言中的整型变量,其取值范围为某个区间上的整数(区间大小因计算机而异),定义在其上的操作为 加 减 乘 除和取模等算数运算。

5.数据结构

简单地说,数据结构(Data Structure)是指数据与数据之间的关系。在任何问题中,数据元素之间都不是孤立的,而是存在着一定的关系,这种关系称为结构(Structure)

例如,有一张学生选课表,这个表就是数据;成绩表中记录了班级每个学生选课的成绩,每个学生的姓名为一行组成一条记录。每个记录由姓名、学号、课程 成绩等字段组成,每个记录就是一个结点也称为数据元素;每个字段就是数据项。姓名字段取值范围为字符型,而课程成绩字段取值为整型。学生选课成绩表的数据 是一组学生成绩信息,这组信息具有相同特性,属于同一数据对象,相邻数据元素之间存在序偶关系,按照学号升序排列。

对于数据结构包含三个部分:逻辑结构;储存结构;运算集合;

而且数据结构有四种基本结构:

·集合结构:在集合结构中,数据元素间的关系是“属于同一个集合”。集合结构是元素关系极为松散的一种结构。

·线性结构:该结构的数据元素之间存在着一对一的关系,即一个数据元素只与另一个数据元素有关系(只有一个开始端点和一个终端点)。

·树性结构:该结构的数据元素之间存在着一对多的关系,即一个数据元素只与另外多个数据元素有关系(只有一个开始端点和多个终端点)。

·图性结构:该结构的数据元素之间存在着多对多的关系,即数据元素之间有多个关系。图形结构也称作网状结构(每个点都可以作为前驱和后继点)。

其图像模型如下:

                                          

 

 

储存结构分为四种:

顺序储存;链式储存;索引储存;散列储存;

 

算法的定义及表示

1. 算法的定义

  做任何事情都有一定的步骤,这些步骤都是有顺序的,而且缺一不可,所以广义地说,算法就是为解决问题而采取的步骤和方法,在程序设计中,算法是 在有限步骤内求解某一问题所使用的一组定义明确的指令序列,通俗点说,就是计算机解题的过程。每条指令表示一个或多个操作。在这个过程中,无论是形成解题 思路还是编写程序,都是在实施某种算法,前者是算法实现的逻辑推理,后者是算法实现的具体操作。

2. 算法的表示

  为了表示一个算法,可以用多种不同的应运。常用的有自然语言,传统流程图,结构化流程图,N-S图,伪代码,计算机语言表示法等。

算法的特征及评价方法

1. 算法的特征

  (1)有穷性,一个算法必须保证在执行有限步骤后结束,而不是无限的。

  (2)确定性,算法中每一条指令必须有明确的含义,而不能是含糊不清的有歧义。

  (3)可行性,每一个操作步骤都必须在有限的时间内完成。

  (4)输入,一个算法可以有多个输入,也可以没有输入。

  (5)输出,一个算法可以有一个或多个输出,没有输出的算法是没有实际意义的。

2. 算法的评价(算法的设计要求)

  (1)正确性,分为以下四个层次

  a. 程序不含语法错误。

  b. 程序对于随意的几组合法输入数据能够得出满足符合要求的结果。

  c. 程序对于精心设计的典型合法数据输入能够得出符合要结果。

  d. 程序对于所有合法的输入数据都能得出符合要的结果。

  (2)易读性

  一个好的算法往往是与他人共享的,晦涩难懂的算法既不易与人交流,也会造成修改调试的维护的极大困难。

  (3)高效性

  如同人们的交往,办事效率的人,人人都愿同他共事,算法也一样,运行时间越少,其效率越高,特别是在大型程序设计中,如果每个算法都具有高效性,那么对于缩短整个程序运行时间是非常有帮助的。算法的效率主要从时间复杂和空间复杂度两个方面来衡量。

  (4)可维护性

  一个好的算法应该对于后期维护保持较低的投入。

 算法分析

  算法分析主要是指分析算法的效率,算法效率的试题主要从两个方面,算法运行时间和算法所需的存储空间。

  在算法分析中,算法整个运行过程所耗费的时间,称为算法的时候复杂度,算法整个运行过程所占用的空间称算法的空间复杂度。

 算法的时间复杂度分析

1. 算法运算埋单的度量

  度量算法执行时间通常有两种方法:

  (1)事后统计的方法

  因为很多计算机内部有计时功能,有的甚至可以精确到毫秒级,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺 陷:一是必须先运行依据算法编制的程序,二是所得时间的统计量依赖于计算机硬件,软件等环境因素,因此人们常采用另一种事前分析估算方法。

  (2)事前分析估算的方法

  通过对算法中不同语句序列的分析,得出算法中所有语句执行次数的相对大小,从而判断算法的运行时间长短。这只是一个相对概念,不是绝对大小。

2. 算法运行时间的分析规则

  影响程序运行时间的因素是多方面的,如机器的运行速度,编译程序产生的目标代码的质量,程序的输入等。通常把一个程序的运行时间定义一个 T(n),其中 n 是该程序输入数据的规模,而不是某一个具体的输入。T(n) 的单位是不确定的,一般把它看起在一个特定计算机上执行的指令条数。

  当讨论一个程序的运行时间 T(N) 时,注重的不是 T(n) 的具体值,而是它的增长率。 T(n) 的增长率与算法中数据的输入规模是紧密相关。而数据输入规模往往用算法中某个变量的函数来表示,通常用 f(n) 表示。随着数据输入规模的增大,f(n) 的增长率与 T(n) 的增长率相近,因此 T(n) 同 f(n) 在数量级上是一致的表示为 T(n) = O(f(n))。

  一个程序运行时间的增长率将最终决定该程序在计算机上能解决多大规模的问题。

  根据语句序列之间的逻辑关系,增长的统计可分为线型累加规则和几何累加规则两种。设 T1(n) = O(f(n)), T2(n)=O(g(n)) 则:

  (1)用线性累加规则,设 T1(n) 和 T2(n) 是程序段 p1 和 p2 运行时间,则执行 p1 之后紧接着执行 p2 的运行时间 T1(n) + T2(n) 是:

  T1(n) + T2(n) = O(max{f(n), g(n)})

  (2)用几何累加规则是:

  T1(n)  . T2(n) = O(f(n) . g(n))

  一般来说,分析程序的时间复杂度是逐步进行的,先求出程序中各语句和各模块的运行时间,再求整个程序的运行时间。一组语句的运行时间(它作为整 个程序运行时间的一部分),可以表示成几个变量或输入数据的规模 n 的函数。整个程序的运行时间一般表示成惟一参数(输入数据的规模 n 的函数)。

  在分析的过程中,我们会遇到各种语句和各种模块,具体分析大致有以下6种情形:

  a. 每个赋值语句或读/与语句的运行时间通常是O(1)。但有些例外情况,如赋值语句右部表达式可能出现函数调用,这时就要考虑计算函数值所耗费的时间。

  b. 顺序语句的运行时间由纯属规则确定,即为该序列中耗费时间最多的语句的运行时间。

  c. 语句 if 的运行时间为条件语句测试时间(通常取O(1))加上分支语句的运行时间,语句 if - else - if 的运行时间为条件测试时间加上分支语句的运行时间。

  d. 循环语句的运行时间是 n 次重复执行循环体所耗费时间的总和,其中 n 是重复的次数。而每次重复循环终止条件和跳回循环开头所花费的时间,后一部分通过取 O(1) ,将常数因子忽略不计,通常认为上述时间是循环次数 n  和 m 的乘积,其中 m 是 n 次执行循环体当中时间耗费最多的那一次的运行时间,进而可以按几何累加规则计算这个乘积。

  遇到多层循环时,要由内层向外层逐层分析,因此,当分析外层循环的运行时间时,内层循环的运行时间应该是已知的,这时可以把内层循环看成是外层循环的一部分。

  e. 当算法运行次数无法确定时。

  在上面的几种情况下,算法的运行次数是可以确定的,但在某些情形下,算法的运行次数可能是无法确定的,如在一给记录中查找某个关键字,查找过程是从第一个记录开始,有可能一次就找到,也可能最后一次才可能找到,还有可能根本找不到。

  如果不能查找成功,当然它的运算次数是 n (n 是被查找的记录个数)。时间复杂度当然是 O(n)。如果能够查找成功,对于这一类算法就要求它的平均运算次数,用平均运算次数表示整个算法的运算次数。

  平均值 = 总的运算次数 / 被运算的记录数

  在查找和排序算法中,都可用此方法。

1.3.2 算法的空间复杂度分析

  空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。算法在计算机存储器内占用的存储空间主要分为三部分:算法源代码本身占用的存储空间,算法输入输出数据所占用的存储空间,算法运行过程中临时占用的存储空间。

  算法输入输出数据所占用的存储空间是由算法所要解决问题的数据输入规模大小来决定的,它不随算法的不同而改变。

  算法源代码本身所占用的存储空间与算法书写的长短成正比,要想缩小这部分空间就得编写简捷的算法源代码。

  算法在运行过程中临时占用的存储空间则随算法不同而有所区别。有的算法占用的临时存储空间大,有的算法占用临时存储空间小,好的算法在程序运行过程中占用的临时存储空间不随数据输入规模的不同而不同。

  在对一个算法进行时间复杂度和空间复杂度的分析时,往往二者不能兼顾,考虑好的时间复杂度,就得牺牲空间复杂度的性能,反之亦然。因此二者要从算法使用的频率,处理的数据的规模等多方面综合协调。

没啦~\(≧▽≦)/~啦啦啦

posted @ 2015-12-21 17:37  流年易逝  阅读(1371)  评论(0编辑  收藏  举报