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-算法的存储空间需求

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

原文地址:https://www.cnblogs.com/yachao30/p/12165073.html

时间: 2024-12-24 18:20:12

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

数据结构 第一章学习小结

数据结构   第一章学习小结 1.数据结构第1章的心得体会: 这周学习了数据结构的绪论及第一章.初步了解了数据结构与算法的相关概念,一开始看书看视频时觉得还挺抽象的,不能够完全理解.但是反复多看了几遍之后,结合例题,自己去操作去跑代码,慢慢觉得容易理解接受起来了.由于现在以网课形式进行教学,老师上课的同时基本还是靠自己去理解学习.当然老师也发挥很大的作用,比如让我们更深入的了解递归的空间复杂度为什么与问题规模有关,又怎样去找到该函数的临界值等等.既锻炼了我们深入思考的能力,也让我们更加清楚了解不

数据结构第一章

证明数据结构分析中的结论的两个常用的方法时归纳法和反证法 归纳法:第一步是证明基准情形,就是确定定理对于某个小的值的正确性,(这一步几乎是很简单的 第二部,进行归纳假设,一般来说,这意味着假设定理对直到某个有限数k的所有的情况都成立的,然后使用这个假设证明定理对于下一个值也是成立的. 反证法:通过假设定理不成立,然后证明该假设导致某一个已知性质不成立,从而说明原假设是错误的. 反证法和归纳法不同处,归纳发从基础出发,反证法从结论出发. 什么是递归:当一个函数用他自己来定义时就称为是递归. 不是所

c语言程序设计第一章3

字符数组是C语言中最常用的数组类型.下面我们通过编写一个程序,来说明字符数组以反操作字符数组的函数的用法.该程序读入一组文本行,并把最长的文水行打印出来.该算法的基本框架非常简单: while (还有未处理的行) i f (该行比已处理的最长行还要长) 保存该行 保存该行的长度 打印最长的行 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAXLENGTH 100//文本的最大长度 4 int getline(char l

数据结构第一章学习小结

第一章学习了一些基本概念以及它们之间的联系,对数据结构这门课程有了初步的了解.刚开始看书的时候,有很多地方不是很明白,对一些名词的解释也不懂,后来结合视频讲解才比较透彻.一开始不清楚ADT的作用,直到自己去写了一遍才有体会.当自己不懂或者不会的时候,一定要自己上手去写去打代码,才能明白困扰自己的那个点在哪里,通过查资料.看视频等等方式解决这个问题.数据结构和算法是相辅相成的,理解透彻基本的概念,才能为之后的学习铺路.这学期要肯花功夫,本来基础就不是很好,更应该笨鸟先飞.对概念的理解不透彻,或言之

第一章 数据结构概论

1.1  什么是数据结构 在数据结构中数据之间的关系主要有两种:线性关系和非线性关系(非线性关系又分为树形关系和图形关系). 如上图:每个数据单位(一条学生记录)相邻的前一个数据单位最多只能有一个(第一个没有),相邻的后一个数据单位最多只能有一个(最后一条没有).这种数据单位的集合成为数据集合,这种数据之间的关系成为线性关系(这种数据文件就是一个线性表). 我们的电脑硬盘中的目录文件结构,是一个树形结构(树形关系),这种即是非线性的: 多台电脑之间互相通信的多对多的关系,属于非线性关系中的图关系

第一章 数据结构绪论

本文章作为学习笔记,大量参考了<大话数据结构>这本书,因为没有用于商业活动,而且也算是为作者做了一个小小的宣传,作者应该不会告我侵权,哈. 数据结构的概念:是相互之间存在的一种或多种特定关系的数据元素的集合.(学了半天这个概念得知道吧!) 开场白 数据结构有什么用?如果你想走程序员的道路,如果你不想一辈子搬砖,如果你想比别人工资高百分之三十,如果你想让家人过上好日子,如果...  够现实了吧! 数据结构的起源 数据结构是程序员的炼狱,你经历了数据结构的"折磨"才能蜕变.数据

PTA 程序设计题(数据结构第一章)

C语言版 第一题 二分查找 感觉还好 Position BinarySearch(List L, ElementType X) { // 数组大小 // int N = sizeof(L->Data) / sizeof(*L->Data); int start = 1; int end = L->Last; int mid; while (start <= end) { mid = (start + end) / 2; if (L->Data[mid] > X) end

数据库系统原理之第一章数据系统基本概念总结 .

昨天,听了米老师的讲课之后突然对原本"晕晕乎乎"的数据库有了新的认识,以下便是听了米老师的讲解之后又结合我自己的理解和小童师姐的帮助下对<数据库系统原理>第一章的认识:     首先,将第一章分了三大类:数据.DBMS.DBS:     其次,数据中包括阶段.描述.级别:DBMS大体分为模式和功能两类:DBS又分为组成和结构:     详细请参见导图: (有认识不到位或做的不好的地方还请多多指出 http://weibo.com/p/10016037514362268467

第一章——数据结构之绪论

1.1 什么是数据结构 1.2 基本概念和术语 1.3 抽象数据类型的表示与实现 1.4 算法和算法分析 1.4.1 算法 1.4.2 算法设计的要求 1.4.3 算法效率的度量 1.4.4 算法的存储 1.1 什么是数据结构 一般来说,用计算机解决一个具体的问题时,大致需要经过下列几个步骤: 1.首先要从具体问题抽象出一个适当的数学模型 2.然后设计一个解此数学模型的算法 3.最后编出程序,进行测试,调整直至得到最终解答 寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间