C语言数据结构——第一章 数据结构的概念

一、数据结构的基本概念

  1.1-数据结构是什么?

    数据结构是计算机存储和组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。一般情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

    想要对大型复杂程序的构造进行系统而科学的研究,必须首先对这些程序中所包含的数据结构进行深入的研究。

    • 数据:通常用于描述客观事物,是对客观事物的符号表示。例如:在我们平时使用的各种文字、数字和特定符号都可以称之为数据。而在计算机中,数据是指所有能够输入到计算机中存储并被计算机程序处理的符号的集合,因此在计算机中,数据的含义及其广泛,如声音、视频等这些被被编码后都属于数据的范畴。
    • 数据元素数据的基本单位,也可以称之为数据结点,在计算机程序中通常将其作为一个整体进行考虑和处理。如果我们用身份证号,民族,姓名等信息来标识某个人,那么由身份证号、民族、姓名等组成的记录就是一个数据元素。
    • 数据项是构成数据元素的不可分割的最小单位,也可以称之为字段或属性,例如,对于上诉某个人记录中的身份证号,民族,姓名等其中任何一项都可以被称之为数据项。
    • 数据对象是性质相同的数据元素的集合,是元素的一个子集,例如:整数的数据对象是集合N={0,1,2,3,4,5······},英文字母的数据对象是集合M={'a','B,'c','D','e'······}
    • 数据结构是相互之间存在一种或多种特定关系的数据元素的集合,通常这些数据元素都不是孤立存在的,而是通过一种或多种特点将所有数据联系起来,我们讲这种关系称之为结构。数据结构通常包括数据的逻辑结构和存储结构两个层次。

  1.2-数据的逻辑结构

    数据的逻辑结构是从数据元素的逻辑关系上抽象描述数据,通常是从求解问题中提炼出来的。数据的逻辑结构与数据的存储无关,是独立于计算机的,因此数据的逻辑结构可以被看作是从具体问题中抽象出来的数据模型

    数据元素之间的逻辑结构是多种多样的,根据数据元素之间的不同关系特性,通常可将数据逻辑结构分为4类,即集合线性结构树形结构图状(或网状)结构,具体如图:

                

    •   集合:如(a)所示,该结构中的数据元素除了属于同一集合以外,两两之间并无其他关系。比方说一个员工是否属于本部门,此时需要将部门看作一个集合。
    •   线性结构:如(b)所示,该结构中的数据之间存在一对一的逻辑关系,并且起始元素和终端元素都是唯一的。
    •   树形结构:如(c)所示,该结构中的数据是存在一对多的逻辑关系,并且除了起始元素外,其余每个元素都有且仅有一个在其之前的元素,除了终端元素外,其余每一个元素都有一个或多个在其之后的元素。
    •   图状(或网状)结构:如(d)所示,该结构中的数据元素存在多对多的逻辑关系,每个元素都可能有一个或多个在其之前或在其之后的元素。

  1.3-数据的存储结构

    数据的存储结构是指数据在计算机中的表示方法(表示又可以称之为映像),是数据的逻辑结构在计算机中的存储实现,因此在存储是应包含两方面的内容——数据元素本身数据元素之间的关系。数据存储到计算机中既要求存储各节点的数值,又要存储节点与节点之间的逻辑关系。在实际应用中,数据有各种各样的存储方法,大致可以分为4类(顺序存储结构、链式存储结构、索引存储结构、哈希(或散列)存储结构)。

  1. 顺序存储结构:

    顺序存储结构是采用一组物理上连续的存储单元来一次存放所有的数据元素,元素之间的逻辑关系有存储单元地址间的关系隐含表示。

    优点:节省存储空间,只需要存储数据结点,并不需要存储结点的逻辑关系。

    缺点:不便于修改,插入和删除某个结点需要修改一系列的结点。

   2.链式存储结构

    链式存储结构给每个结点增加指针字段,用于存放临近结点的存储地址,每个结点占用两个连续的存储单元,一个存放数据,一个存放临近结点(前驱/后继结点)的地址。  

    优点:便于修改,修改时只需要修改结点的指针字段,不需要移动其他结点。

    缺点:占用存储空间,因为需要存储结点之间的逻辑关系。因为结点之间不一定相邻,因此不能对结点进行随机访问。

   3.索引存储结构

    索引存储结构即在存储结点的同事,增加索引表,索引表的索引项为:(关键字,地址),关键字标识结点,地址为结点的指针。各结点的地址在索引表中是一次排列的。

    优点:可以快速查找,可以随机访问,方便修改。

    缺点:建立索引表增加了时间和空间的开销。

   4.哈希(或散列)存储结构

    哈希存储结构是根据结点的值确定结点的存储地址。以结点作为自变量,通过散列函数算出结果i,再把i作为结点的存储地址。

    优点:查找速度快,适用于快速查找和插入的场景。

    缺点:只存放结点数据,不存结点之间的关系。

  1.4-数据类型

    数据类型是和数据结构密切相关的一个概念,它最早出现在高级程序语言中,用以刻画(程序)操作对象的特性。在用高级程序语言编写的程序中,每个变量、常量或表达式都有一个它所属的确定的数据类型。按“值”的不同特性,高级语言中的数据类型可以分为两类:一类是非结构的原子类型,一类是结构类型

    1.4.1-非结构的原子类型

      原子类型的值是不可以分解的,例如C语言中的基本类型(整型、实型、字符型、枚举类型)、指针类型和空类型。

    1.4.2-结构类型

      结构类型的值是由若干成分按某种结构组成的,因此是可以分解的,并且它的结构可以是非结构的,也可以是结构的。

  1.5-抽象数据类型

    抽象数据类型(abstract data type简称ADT)是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论求其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。

    抽象数据类型和数据类型实际上是一个概念。例如,各个计算机都拥有的“整数”类型是一个抽象数据类型,尽管它们在不同的处理器上实现的方法可以不同,但由于其定义的数学特性相同,在用户看来都是相同的。因此,“抽象”的意义在于数据的数学抽象特性

    1.5.1-原子类型

      属原子类型的变量的值是不可以分解的。这类抽象数据类型较少,因为一般情况下,已有的固有数据类型足以满足需求。但有时也有必要定义新的原子数据类型,例如数位为100的整数。

    1.5.2-固定聚合类型

      属该类型的变量,其值由确定数目的成分按某种结构组成。例如,复数是由两个实数依确定的次序关系构成。

    1.5.3-可变聚合类型

      和固定聚合类型相比较,构成可变聚合类型“值”的成分的数目不确定。例如,可定义一个“有序证书序列”的抽象数据类型,其中序列的长度是可变的。

  1.6-多形数据类型

      多形数据类型是指其值的成分不确定的数据类型。从抽象数据类型的角度看,具有相同的数学抽象特性,故称之为多形数据类型。

  1.7-算法和算法分析

    1.7.1-算法

    算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作;此外,一个算法还具有五个重要特性:有穷性确定性可行性输入输出

    •   有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都可在有穷时间内完成
    •   确定性:算法中每一条指令必须有确切的含义,在他人理解时不会产生二义性。并且,在任何条件下,算法只有惟一的一条执行路径,即对于相同的输入只能得出相同的输出。
    •   可行性:一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的
    •   输入一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
    •   输出一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量。

    1.7.2-算法设计的要求

    •   正确性算法应当满足具体问题的需求。设计或选择的算法应当能正确的反应需求;否则算法的正确与否的衡量准则就不存在了。
    •   可读性:算法主要是为了人的阅读与交流其次才是机器执行。可读性好有助于人对算法的理解;晦涩难懂的程序容易隐藏很多的错误,难以调试和修改。
    •   健壮性:当输入数据非法时,算法也能适当的做出反应或进行处理,而不会产生莫名其妙的输出结果。
    •   效率与低存储量需求:通俗的讲,效率就是算法的执行时间要短存储量需求指的是在算法执行期间所占用的空间存储量,越低越好。

    1.7.3-算法效率的度量

      算法执行的时间依据运行时所消耗的时间来度量,而度量一个程序的执行时间通常有两种方法:

     (1)事后统计的方法

        因为很多计算机内部有计时功能,不同算法的程序可以通过一组或若干组相同的统计数据以分辨优劣。但是这个方法有两种缺点一是必须先运行依据算法编制的程序;二是所得的时间统计计量依赖于计算机的硬件软件等环境因素,有时容易掩盖算法本身的优劣

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

    • 依据的算法选用何种策略
    • 问题的规模,例如求100以内还是1000以内的素数
    • 书写程序的语言,对于同一个算法,实现语言的级别越高,执行效率就越低
    • 编译程序所产生的机器代码的质量
    • 机器执行指令的速度

    1.7.4-时间复杂度

      -1:渐近时间复杂度本质就是算法的执行时间,也就是算法中所有语句的频度之和。

      -2:语句频度就是语句的执行次数,它与算法求解问题的大小规模有关。

    1.7.5-算法的存储空间需求

      一个算法的存储量包括形参所占空间和临时变量所占空间。在对算法进行存储空间分析时,只考察临时变量所占空间

猜你喜欢

转载自www.cnblogs.com/yachao30/p/12165073.html
今日推荐