精华内容
下载资源
问答
  • 文章目录关系数据库关系数据库简介关系数据结构及形式化定义关系操作关系模型的完整性关系代数 关系数据库 关系数据库简介 美国????IBM公司的E.F.Codd 1970年提出关系数据模型E.F.Codd, “A Relational Model of ...

    本人就职于国际知名终端厂商,负责modem芯片研发。
    在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。

    关系数据库

    关系数据库简介

    • 美国🗽IBM公司的E.F.Codd
      1970年提出关系数据模型E.F.Codd, “A Relational Model of Data for Large Shared Data Banks”《Communication of the ACM》
      1970之后,提出了关系代数和关系演算的概念
      1972年提出了关系的第一、第二、第三范式的规范化理论
      1974年提出了关系的BC范式
      奠定了关系数据库的理论基础
    • 关系数据库系统是支持关系模型的数据库系统
    • 关系模型由数据结构、关系操作集合和完整性约束三部分组成
    • 单一的数据结构------关系🔗
      但关系模型的这种简单的数据结构能够表达丰富的语义,描述出现实世界的实体以及实体间的各种联系
    • 关系操作
      • 关系模型中常用的关系操作包括两类:
        ⭐查询操作:选择、投影、连接、除、并、交、差
        ⭐增加、删除、修改操作
      • 特点:操作的对象和结果均是集合;一次一集合
      • 关系数据语言:
        🔸三类:关系代数语言、关系演算语言和具有关系代数和关系演算双重特点的语言

    关系数据结构及形式化定义

    关系

    • 在关系模式中,数据是以二维表的形式存在的,这个二维表就叫做关系

    • 关系理论是以集合代数理论为基础的,因此我们可以用集合代数给出二维表的“关系”定义

    • 为了从集合论的角度给出关系的定义,我们先引入域和笛卡尔积的概念 :
      ⭐域(Domain)

      • 域是一组具有相同数据类型的值的集合,又称为值域(用D表示)
        例如,整数、实数、字符串的集合
      • 域中所包含的值的个数称为域的基数(用m表示)
      • 关系中用域表示属性的取值范围
        例如:
        D1={李力,王平,刘伟} m1=3
        D2={男,女} m2=2
      • 域中的值无排列次序,如D2={男,女}={女,男}

      ⭐笛卡尔积(Cartesian Product)

      • 给定一组域D1,D2,…,Dn(它们可以包含相同的元素,即可以完全不同,也可以部分或全部相同)。D1,D2,…,Dn的笛卡尔积为D1×D2×…×Dn={(d1,d2,…,dn)| di∈Di,i=1,2,…,n}
      • 有定义可以看出,笛卡尔积也是一个集合
        其中:
        元素中的每一个di叫做一个分量(Component),来自相应的域(di∈Di);
        每一个元素(d1,d2,…,dn)叫做一个n元组(n-tuple),简称元组(Tuple)。但元组不是di的集合,元组的每个分量(di)是按序排列的,如:(1,2,3)≠(2,3,1)≠(1,3,2);而集合中的元素是没有排序次序的,如:1,2,3)=(2,3,1)=(1,3,2)
        若Di(i=1,2,…,n)为有限集,Di中的集合元素个数称为Di的基数,用mi(i=1,2,…,n)表示,则笛卡尔积D1×D2×…×Dn的基数M(即元素(d1,d2,…,dn)的个数)为所有域的基数的累乘之积,即M= ∏ i = 1 n m i \prod_{i=1}^nm_i i=1nmi 例如:
        上述表示教师关系中姓名、性别两个域的笛卡尔积为
        D1×D2={李力,男),(李力,女),(王平,男),(王平,女),(刘伟,男),(刘伟,女)}
        其中:
        🔹 李力、王平、刘伟、男、女都是分量
        🔹(李力,男),(李力,女)等是元组
        🔹其基数M=m1×m2=3*2=6
        🔹元组的个数为6
        笛卡尔积可用二维表的形式表示
        例如,上述的6个元组可表示成下表👇
        姓名性别
        李力
        李力
        王平
        王平
        刘伟
        刘伟
        由上例可以看出,笛卡尔积实际是一个二维表,表的框架由域构成,表的任意一行就是一个元组,表中的每一列来自同一域,如第一个分量来自D1,第二个分量来自D2。

      ⭐关系(Relation)

      • 笛卡尔积D1×D2×…×Dn的任一子集称为定义在域D1,D2,…,Dn上的n员关系,可用R(D1×D2×…×Dn)表示。
        如上例D1×D2笛卡尔积的子集可以构成教师关系T1,如下表:
        在这里插入图片描述
      • 几点说明
        • R为关系名,n称为关系的目或度(Degree)
          当n=1时,称为单元关系
          当n=2时,称为二元关系
          … …
          当n=n时,称为n元关系
        • 关系是笛卡尔积的有限子集,即是一个二维表,行对应一个元组、列对应一个域、每列的名称称为属性
        • n目关系必有n个属性

      ⭐属性、码的概念

      • 候选键与关键字
        • 能唯一标识关系中元组的属性或属性集,则称该属性或属性集为候选键(Candidate Key),也称候选关键字或候选码。如:
          ■ “学生关系”中的学号能唯一的标识每一个学生,则属性学号是学生关系的候选键
          ■ 在“选课关系”中,只有属性的组合“学号+课程号”才能唯一地区分每一条选课记录,则属性集“学号+课程号”是选课关系的候选键
        • 如果一个关系中有多个候选键,可以从中选择一个作为查询、插入和删除元组的操作变量,被选用的候选键称为主关系键(Primary Key),或简称为主键、主码、关系键、关系字。
          例如:在学生关系中假设存在身份证号属性,则“学号”和“身份证号”都可以作为学生关系的候选键,如果选定“学号”作为数据操作的依据,则“学号”为主关系键
        • 主关系键是关系模型中的一个重要概念。每一个关系必须选择一个主关系键,选定以后,不能随意改变。每个关系必定有且仅有一个主关系键,因为关系的元组无重复,至少关系的所有属性的组合可作为主关系键,通常用较小的属性组合作为主关系键
      • 主属性与非码属性
        • 主属性(Prime Attribute):包含在任何一个候选码中的各属性称为主属性
        • 非码属性(Non-Prime Attribute):不包含在任何候选码中的属性称为非码属性,或非主属性(Non-key Attribute)
        • 在最简单的情况下,一个候选码只包含一个属性,如学生关系中的“学号”,教师关系中的“教师号”
        • 在最极端的情况下,所有属性的组合是关系的候选码,这时称为全码(All-Key)
          例如:假设有教师课程参考书关系TCB,分别有三个属性 教师号(T)、课程号(C)和参考书(B)。一个教师可以讲授多门课程;一门课程可以为多个教师讲授,它们使用相同的一套参考书;同样每种参考书可以供多门课程使用。在这种情况下,T、C、B三者之间是多对多关系,(T,C,B)三个属性的组合是关系TCB的候选码,称为全码,T,C,B都是主属性
        • 关系的类型
          • 基本关系(通常又称为基本表或基表):实际存在的表,实际存储数据的逻辑表示
          • 查询表:查询结果对应的表
          • 视图表:由基本表或其它视图表导出的表,是虚表,不对应实际存储的数据

      ⭐关系的基本性质

      • 尽管关系与二维表格、传统的数据文件是非常类似的,但它们之间又有重要的区别
      • 严格地说,关系是种规范化了的二维表中行的集合,为了使相应的数据操作简化,在关系模型中,对关系做了种种限制,关系具有如下特性:
        • 关系中不允许出现相同的元组。因为数据上集合中没有相同的元素,而关系是元组的集合,所以作为集合元素的元组应该是唯一的
        • 关系中元组的顺序(即行序)是无关紧要的,在一个关系中可以任意交换两行的次序。因为集合中的元素是无序的,所以作为集合元素的元组也是无序的。根据关系的这个性质,可以改变元组的顺序使其具有某种排序,然后按照顺序查询数据,可以提高查询速度。
        • 关系中属性的顺序是无关紧要的,即列的顺序可以任意交换。交换时,应连同属性名一起交换,否者将得到不同的关系
        • 同一属性名下的各个属性值必须来自同一个域,是同一类型的数据。即列是同质的
        • 关系中各个属性必须有不同的名字,不同的属性可来自同一个域,即它们的分量可以取自同一个域
          例如:有下表中的关系,职业与兼职是两个不同的属性,但它们取自同一个域,职业={教师,公务员,企业主}👇
          在这里插入图片描述
        • 关系中的每一个分量必须是不可分的数据项,或者说所有属性值都是原子的,即是一个确定的值,而不是值的集合。属性值可以是空值,表示“未知”或“不可使用”,即不可“表中有表”。满足此条件的关系称为“规范化关系”,否则称为“非规范化关系”。
          例如:下表中,籍贯含有省、市/县两项,出现了“表中有表”的现象,则为非规范化关系,而把籍贯分成省、市/县两列,将其规范化👇
          在这里插入图片描述

    关系模式

    • 关系数据库中,关系模式是型,关系是值
    • 关系模式是对关系结构的描述,是关系的框架,或称为表框架。它应该:
      • 指出关系由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映像关系
      • 刻画关系必须满足的完整性约束条件
    • 定义:关系的描述称为关系模式(Relation Schema)。一个关系模式应当是一个五元组。它可以形式化地表示为:R(U,D,DOM,F)
      其中R为关系名,U为组成该关系的属性名集合,D为属性组U中属性所来自的域,DOM为属性向域的映像集合,F为属性间数据的依赖关系集合
    • 关系模式通常可以简记为:R(A1,A2,…,An)
      其中R为关系名,A1,A2,…,An为属性名。而域名及属性向域的映像常常直接说明为属性的类型和长度
    • 关系模式是静态的、稳定的;关系是关系模式在某一时刻的状态或内容,动态的、随时间不断变化的

    关系数据库模式

    • 一组关系模式的集合叫做关系数据库模式
    • 关系数据库模式是对关系数据库结构的描述,或者说是对关系数据库框架的描述,与关系数据库模式对应的数据库中的当前值就是关系数据库的内容,称为关系数据库的实例,可以看作是关系的值。
      例如,在教学数据库中,共有五个大系,其关系模式分别为:
      🔹学生(学号,姓名,性别,年龄,系号)
      🔹教师(教师号,姓名,性别,年龄,系号)
      🔹课程(课程号,课程名,课时)
      🔹选课(学号,课程号,成绩)
      🔹授课(教师号,课程号)
      🔹系(系号,系名,地址)
      在每个关系中,又有其相应的数据库的实例,如下图是学生关系模式对应的数据库实例👇
      在这里插入图片描述

    关系数据库

    • 关系数据库是“一组随时间变化,具有各种度的规范化关系的集合”
    • 在关系模型中,实体以及实体间的联系都是用关系来表示。在一个给定的现实世界领域中,相应于所有实体及实体之间的联系的关系的集合构成一个关系数据库
    • 由此可见,关系数据库也有的概念,其型就是关系数据库模式,相对固定;其值就是关系数据库内容,代表现实世界中的实体,而实体是随着时间不断变化的,所以其值在不同的时刻会有所变化

    关系数据库——关系操作&&关系模型的完整性
    关系数据库——关系代数


    在这里插入图片描述

    展开全文
  • 关系数据模型——三个组成部分

    千次阅读 2021-09-04 15:17:03
    关系模型的三个组成部分,是指关系数据模型的数据结构关系数据模型的操作集合和关系数据模型的完整性约束。 关系数据模型的数据结构 主要描述数据的类型、内容、性质以及数据间的联系等,是目标类型的集合。 目标...

    关系模型的三个组成部分,是指关系数据模型的数据结构、关系数据模型的操作集合和关系数据模型的完整性约束。

    • 关系数据模型的数据结构
      主要描述数据的类型、内容、性质以及数据间的联系等,是目标类型的集合。
      目标类型是数据库的祖成成分,一般可分为两类:数据类型、数据类型之间的联系。
    • 关系数据模型的操作集合
      数据模型中数据操作主要描述在相应的数据结构上的操作类型和操作方式。它是操作算符的集合,包括若干操作和推理准则,用以对目标类型的有效实例所组成的数据库进行操作。
    • 关系数据模型的完整性约束
      数据模型中的数据约束主要描述数据结构内数据间的语法、词义联系、他们之间的制约和依存关系,以及数据动态变化的规则,以保证数据的正确、有效和相容。它是完整性规则的集合,用以限定符合数据模型的数据库状态,以及状态的变化。
      约束条件可以按不同的原则划分为数据值的约束和数据间联系的约束;静态约束和动态约束;实体约束和实体间的参照约束等

    数据模型按不同的应用层次分成三种类型:分别是概念数据模型、逻辑数据模型、物理数据模型。
    1、概念模型
    概念模型是一种面向用户、面向客观世界的模型,主要用来描述世界的概念化结构,它是数据库的设计人员在设计的初始阶段,摆脱计算机系统及DBMS的具体技术问题。
    概念模型用于信息世界的建模,一方面应该具有较强的语义表达能力,能够方便直接表达应用中的各种语义知识,另一方面它还应该简单、清晰、易于用户理解。
    2、逻辑模型
    逻辑模型是一种面向数据库系统的模型,是具体的DBMS所支持的数据模型,如网状数据模型(Network Data Model)、层次数据模型(Hierarchical Data Model)等等。此模型既要面向用户,又要面向系统,主要用于数据库管理系统(DBMS)的实现。
    3、物理模型
    物理模型是一种面向计算机物理表示的模型,描述了数据在储存介质上的组织结构,它不但与具体的DBMS有关,而且还与操作系统和硬件有关。
    每一种逻辑数据模型在实现时都有其对应的物理数据模型。DBMS为了保证其独立性与可移植性,大部分物理数据模型的实现工作由系统自动完成,而设计者只设计索引、聚集等特殊结构。

    展开全文
  • 因为教材中的概念之间存在冲突,所以广泛浏览各类教材、视频,对数据结构进行系统、辩证的梳理。建议考研看不懂教材或者视频的同学看一看。

    为什么写这篇文章

    《数据结构》这门课有很多教材,各种概念十分混乱。为了解决概念之间的矛盾,写下这篇博客。
    比如严蔚敏的书中存在数据类型和数据结构的混乱,数据类型和ADT的混乱。书上所写本就自相矛盾,因此引用严书中的内容所写的文章或者录制的慕课大概率是存在问题的。

    计算机科学的各种定义是对实践经验的总结,掺杂了人的主观意识,也就是人为规定的,很多定义,包括数据 结构,至今没有被公认,不像自然定理一样亘古不变,所以建议从历史发展的角度,结合实践经验理解,不要死记硬背,但不是不要记!

    信息与数据

    数据是信息的载体,是描述客观事物的数字、字符、图片、声音等符号的集合,所有的数据在计算机中以二进制比特的形式表示。
    信息是数据的内涵。
    少量数据可能包含很多信息。似乎所有的数据都可能有用,正如黑格尔所说的“存在即合理”。

    数据、数据对象、数据元素、数据项之间的关系
    数据元素是数据的基本单位,也称为元素、记录等,通常作为一个整体考虑。
    数据项是组成数据元素的具有独立含义的、不可分割的最小单位。
    数据对象是性质相同的数据元素的集合。

    程序执行中所用的数据都存于内存。任何数据对象在能用期间都有存储位置,占据一定数量的存储单元。内存单元按顺序排,每个单元有一个称为内存地址的编号,内存数据都是通过地址访问的。高级语言把存储单元、地址等低级概念用变量等高级概念掩盖起来,使写程序时可以不必过多关心这方面细节。但内存与地址等仍是最基本的重要概念 。

    个人感觉,严书两个版本对数据元素的理解有不同。这从对数据结构的定义的差别中可以感受到。详见后文存储结构部分。
    若是按照严书1 理解,数据元素和关系区别开。
    若是按照严书2理解,数据元素包括数据和逻辑关系,即表示关系的数据也算是数据元素或数据元素的一部分。

    数据类型

    数据类型的本质是固定内存大小上的储存方案和操作方案
    数据类型关注的是比特组合表示什么,也就是怎么用比特组合表示数据的问题,关注的是一个数据元素的data representation。

    数据类型的概念最早出现在高级程序设计语言,发源于硬件,是一种解释计算机中的数据的手段。
    计算机内所有的的数据都是二进制数字,电路工程师设计一个CPU,需要人工制定一个规则来使用数据,要考虑如何对数字进行编码表示,并根据编码规则设计加法器、乘法器等。
    如果没有了这个规则,就说不清比特串代表什么,不知道从哪里开始到哪里结束代表一个数字,有可能8个比特代表一个整数,有可能16个比特代表一个整数,也可能是浮点数或者其他的数。
    工程师将数字按类别分组,用一个编码方式解释一个类里的所有数字,不同类的数字采用不同的编码方式。这个方法算是一种简单的抽象,毕竟总不能一个数字专门定制一个规则。

    写程序也就是要描述怎么表示数据并处理数据。
    高级程序设计语言,在硬件提供的编码方式的基础上,继续将数据抽象分类,使属于同一类型的数据具有相同的编码规则,并为程序员提供了数据描述机制。
    比如C语言,将若干位的比特数字规定为整型数字,并命名为int类型,还提供声明和定义机制,如int a;标识符a表示内存中的一块区域,按照int类型的规定使用这块区域。
    这种描述数据的机制,在程序设计中被规范地称为数据类型

    数据类型规定了一类数据所有可能取值的范围,以及在这些值上允许进行的操作。可能所有的CPU都提供int类型,但如果编码方式不同,能在其上进行的操作的过程不同,电路实现不同,严格地讲,就不能算作同一种数据类型。
    在计算机发展初期,计算机主要处理数值计算问题,整数、浮点数等是经常用到的运算对象,所以CPU一般会支持整数、浮点数等数字的计算。整数、浮点数等数据模型简单,不需要设计复杂的存储方法,因此不重视数据结构。

    随着程序设计的规范,抽象数据类型被提出。抽象数据类型(Abstract Data Type,简称ADT)是数据类型的数学抽象,是一个数学模型以及定义在该模型上的一组操作,不考虑其具体实现,也不依赖特定的编程语言。

    严蔚敏的数据结构中说,数据类型和抽象数据类型实质上是一个概念1。个人认为将两个概念当作一个是不严谨的。
    书中说是一个概念,是因为书中认为,对于使用数据类型的普通用户来说,不必了解的细节都被封装了,尽管实现不同,但数学特性相同,在用户看来都是一样的。而且数据结构的思想不依赖于特定的编程语言

    但是数据类型即使封装了细节,还是已经包含了具体实现,而抽象数据类型完全不涉及具体实现。当然我们在实际使用中,也确实对两个概念几乎完全不做区分,是因为大多时候我们不依赖于数据类型的实现细节,但这不代表不知道如何实现,有时也需要考虑数据类型的实现。

    对于高级的程序员,要多多少少对实现方法具备一些了解,即使不考虑数据类型的实现,也要或多或少地考虑程序设计语言的特性,并不是完全只需要考虑其数学上的抽象特性。
    对于依赖实现细节的硬件工程师来说,数据类型和抽象数据类型显然是不一样的。

    数据结构

    数据在内存或者硬盘中不是胡乱存储的,就像图书馆的书不是随便放在书架上的,所以为了研究怎么摆放计算机中的数据更好,就有了《数据结构》这门课。

    什么是数据结构

    数据结构是(数据对象)与(对象中数据元素之间的关系)的集合,是(逻辑上) 组织、(物理上)存储数据的方法,当然在计算机里也是数据,当然也是一门
    数据结构关注的是数据对象的data strorage。

    数据结构起源于程序设计,并随着程序设计的发展而发展。人们在进行程序设计时通常关注两个重要的问题,一是如何将待处理的数据存储到计算机内存中,二是如何设计相应的算法操作这些数据,即数据处理。数据表示的本质是数据结构设计,数据处理的本质是算法设计。
    计算机发展初期,人们使用计算机主要处理数值计算问题,所涉及的运算对象是简单的整数、浮点数、字符及布尔型数据,不需要设计复杂的存储方法,因此不重视数据结构。
    非数值计算的问题越来越重要,如何表示数据成为重要的问题,数据结构及抽象数据类型被提出,从而使程序设计越来越规范。

    在早期的面向过程的结构化程序设计中,程序设计一般原则——程序=数据结构+算法,就是先分析数据的数学模型和要对其进行的操作,确定如何存储数据和怎么实现操作,在这之后编写程序就很容易了。
    而结构化程序设计中,数据和过程分离,所以把数据结构定义为二元组(D,S),D为数据元素的有限集,S为关系的有限集,未考虑数据结构上的操作。由于结构化程序设计影响深远,所以习惯性地把数据结构定义为二元组。

    在面向对象程序设计中,数据结构可以看作一个容器对象。利用面向对象的开发方式,数据和过程放在一起,所以有时候,数据结构又包含了其上的操作,变成了三元组(D,S,P)。
    而我们上这门课,肯定是要讨论数据结构上的操作的,所以用面向对象的方法描述数据结构更合适。

    数据结构,作为一门课程,这门课研究的是(数据的逻辑上的组织方法和物理上的存储方法),也就是(先把数据模型化,再研究如何放在计算机里表示)。这门课不是程序设计课2.0,而是要通过精心设计数据结构,为程序带来更高的运行或者存储效率。

    所以数据结构包含逻辑结构存储结构两个层次(不是并列)。
    编写程序将逻辑结构映射成存储结构,并实现可在数据结构上进行的各种操作。

    以下几条来自不同教材里对数据结构的定义,对比体会。

    1. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。12
      个人认为,这句话把关系作为数据元素的定语,关系和数据元素的地位不够平等。书中也说这是书中的一种简单解释。而且第二版2由此出发的对存储结构的定义让人感觉有些疑惑。
    2. 数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。3
    3. 数据结构是ADT的物理实现。4
      如果把数据结构当成一个容器对象,这个对象的抽象类,即ADT。 编程是在描述解决问题的办法,则在编程中,ADT的实现是对(组织、存储数据的方法和对数据进行的操作)的抽象模型的具体描述。想一想编程中如何实现数据结构,比如C语言,差不多就是声明结构类型和函数,将其定义,再初始化,好像很大一部分工作就是在实现某种ADT,也就是在具体描述组织、存储数据的方法和对数据进行的操作。在程序运行时,ADT的物理实现就可以是一个容器对象。

    逻辑结构

    逻辑结构从逻辑关系上描述数据,也就是数据的数学模型,与数据的在计算机中的存储无关。这个模型考虑的不只限于现有的有限数据,还要考虑范围更广的同类的数据。

    任意一个数据元素可以和n(n>=0)个数据元素有逻辑上的关系。
    逻辑结构可以分为四类:

    • 多对多的关系为图结构或网状结构;
    • 一对多为树结构;
    • 一对一为线性结构;
    • 除了同为一个集合外,别无其它关系为集合结构。
      逻辑结构也可以分为 线性结构 和 非线性结构两大类。
      可以认为,图结构表示的关系最复杂;树是一种特殊的图;线性结构是一种特殊的树结构,也是一种特殊的图结构;集合是没有关系的图结构。

    存储结构

    若是按照严书1,数据元素和关系区别开。
    ​数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。
    ​数据元素的位串称为元素或节点,他的子位串称为数据域。因此元素或结点可看成是数据元素在计算机中的映像。

    若是按照严书2,数据元素包括数据和逻辑关系。
    数据对象在计算机中的存储表示称为数据的存储结构。把数据对象存储到计算机时,通常既要存储各数据元素的数据,又要存储数据元素之间的逻辑关系

    严书1提到数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像
    按照严书1的理解,重点在关系的表示。

    1. 顺序映像,借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,即通过相对位置来寻址。
    2. 非顺序映像,使用地址表示数据元素之间的逻辑关系。比如为了表示结点之间的关系,给每个结点附加指针字段,用于存放后继元素的存储地址。

    综合使用顺序映像和非顺序映像来存储数据,总结起来有四种基本方法,即殷人昆的书提到顺序存储方法链式存储方法索引存储方法散列存储方法5

    1. 顺序存储方法,该方法把逻辑上相邻的元素放到物理位置上相邻的存储单元中,数据元素之间的逻辑关系由顺序映像表示,也就是有存储单元的邻接位置关系来体现。由此得到的存储表示称为顺序存储结构。所谓的顺序不只包括无间隔的紧邻,诸如间隔k个字节,a^k个字节,都算是顺序存储。

    2. 链式存储方法,该方法不要求逻辑上相邻的元素在物理上相邻,㢝之间的逻辑关系由附加的指针指示。由此得到的存储表示称为链式存储结构

      1和2基本上是两个极端。顺序存储结构占用内存严重,链式存储结构寻址困难,综合两者的特性,做出寻址容易,插入删除也容易的数据结构。

    3. 索引存储方式,采用附加的索引表的方式来存储节点信息的一种存储方式。索引表由若干索引项组成。索引存储方式中索引项的一般形式为(关键字、地址)。

    4. 散列存储方法,根据结点的关键字计算直接得到该结点的存储地址。

    四种基本存储方法,既可单独使用,也可组合使用。
    同一种逻辑结构使用不同的存储方法可以实现不同的存储结构。

    严书2提到数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构和链式存储结构
    按照2的理解,有这两种基础的存储结构,可以组合成其他数据结构的存储结构,比如,散列表。

    总之,存储结构是逻辑结构在计算机中的物理映射,也就是抽象的数据在内存里的物理实现。
    把数据存储到计算机中,通常既要存储数据元素,又要存储数据元素之间的逻辑关系。
    存储结构=物理结构=存储表示=物理表示=存储映像=物理映像

    ADT、数据类型、数据结构之间的关系

    不同语言的《数据结构》

    数据结构考虑的是数据对象的Data storage——怎么存数据对象的问题,而数据类型考虑的是数据元素的Data representation——怎么表示数据元素的问题。

    6为了描述数据,程序语言提供的数据机制必须足够丰富,以满足人们写程序的实际需要。程序语言的机制不能无限地庞大,使语言过分臃肿,难以使用;这些机制也不应过于低级,一直需要描述一点点东西都非常繁琐。 后面这种情况正是机器语言和汇编语言的一个弱点。
    经过几十年的研究和实践,目前高级语言领域在这个方面已经形成了一套公认有效的方式,一般语言都采用这种模式的数据机制,其基本框架包括几个互相联系的方面:

    1. 把语言要处理的数据对象划分为一些类型,每个类型是一个数据值的集合。例如C语言里的int类型是这个类型能够表示的所有合法整数值的集合。
    2. 提供一组基本数据类型,为他们确定书写方式,提供一组相关的基本操作(运算),以支持程序中队基本数据类型的表示和使用。
    3. 提供了一组由简单的数据类型或数据对象构造更加复杂的数据类型或数据对象的手段,反复使用这些手段可以一层层地构造起任意复杂的数据结构,以满足程序中处理复杂数据的需要。

    市面上有各种语言的数据结构的书,但是程序设计语言只是一种描述数据结构的工具,我们当然可以不使用数据类型这个概念,可以不用某种高级程序设计语言,可以直接用01比特,可以只用自然语言描述数据结构,《数据结构》这门课归根结底是要想办法有组织地把01比特存储在内存中。
    不过为了简化描述抽象算法,分类与评价数据结构,使用高级程序设计语言,尤其是其中的ADT的概念,来讲解数据结构。
    ADT的思想和面向对象是一致的,我们既要考虑数据结构,也要考虑其上的操作,所以用面向对象的方法描述数据结构比较方便、有效,但本课程大都在大学低年级开设,用C语言的描述方法更符合学生的实际情况。
    数据结构是一门介于软件和硬件之间的课,重要的不是用什么语言,而是要理解数据逻辑上的组织方式和在内存中的存储方式,所以说这门课不是程序设计课。

    数据结构与抽象数据类型

    网友认为数据结构是一种抽象的封装,我们平时写程序都是直接去调用这些数据结构,而没有去想它们的内部实现是怎样的。
    这种想法有些不严谨。网友说的是编程语言的数据类型。
    《数据结构》这门课使用哪门语言不重要,重要的是抽象地描述,所以有的教材直接使用ADT的概念,而不是数据类型。
    可以认为,抽象数据类型,是逻辑结构+运算在程序设计中的等价概念,是数据结构的接口描述。

    从程序设计的角度看,抽象数据类型使用不同的存储方法可以实现不同的数据类型,然后在程序运行中,可以使用数据类型来存储数据,从而把逻辑结构表示为存储结构,并实现算法。例如,列表的抽象数据类型可以以数组或链表为基础来实现为数据类型。
    对于可操作数据对象完全相同的数据类型,如果给它定义具有不同功能的一组,则可形成不同的抽象数据类型。例如队列和优先级队列,它们可能使用相同的顺序表结构来实现为数据类型,但队列是先进先出,优先级队列是优先级高的先出,具有各不相同的服务,是不同的抽象数据类型。

    我们平时编程中调用的是封装好的数据类型或者数据类型模板,利用某种数据类型定义数据,把数据组织、存储成数据结构。
    比如C++的STL的vector,他是一个顺序型容器类模板,我们可以利用 vector类模板,定义一个可以存储并管理int类型数据的vector< int >类型的容器,容器是一个能存储并管理对象的对象。这个对象与存储在对象中的其他对象一起构成了一个数据结构,也就是带有关系的数据元素的集合。

    一般我们在高级程序设计语言的层面进行软件设计。抽象数据类型处于软件层面,是编程语言理论的概念。而数据结构是在硬件和软件之中都有被用到,和语言无关,关注的是数据逻辑上的组织方式和在内存中是怎么存储的,最终还是要实现为01比特流。在编程中,我们使用数据类型描述组织、存储数据的方式和操作。在程序运行中,把数据元素组织、存储成带关系的数据元素的集合,也就是数据结构的存储结构。

    反过来说,数据结构是组织和存储的方法,而不是操作方法。我们可以把组织和存储的方法和操作方法结合并抽象成数据类型,在更高的层次上进行软件分析和设计。

    抽象数据类型的概念与面向对象方法的思想是一致的。。。。未完待续

    未完待续

    孤立地理解某一个概念,而不注意他们之间的联系是不可取的。
    比如,我们想定义一个整数类型,数学里的整数取值范围是无穷的。
    由于CPU的工作机制决定了它每次计算的数得是定长的,而定长就表示它只能表示有限范围内的数。虽然只要内存无限,当然可以设计出没有位数上限的整数运算的硬件。但是CPU为了通用,只提供最基本数据类型,不提供其他多余的功能。
    那么我们通过软件的方式来实现一个取值范围无穷的整数类型,使用高级程序设计语言提供的int类型构造这个ADT,显然逻辑上是线性结构,存储上可以选择链表或者顺序表。

    未完待续


    1. 严蔚敏,吴伟民,数据结构(C语言版) ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    2. 严蔚敏,李冬梅,吴伟民,数据结构(C语言版)(第二版) ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    3. Clifford A.Shaffer, 数据结构与算法分析 ↩︎

    4. Sartaj Sahni,数据结构、算法与应用 ↩︎

    5. 殷人昆,数据结构(用面向对象方法与C++语言描述)(第二版) ↩︎

    6. 裘宗燕,从问题到程序——程序设计与C语言引论 ↩︎

    展开全文
  • (一)数据结构的起源,常见的名词解释,数据元素之间的关系 何为数据结构? 待处理的数据以及数据之间的关系 数据元素之间一种或多种特定关系的集合 数据结构的起源 一开始计算机是计算数值用的,...

    何为数据结构?

    • 待处理的数据以及数据之间的关系

    • 数据元素之间一种或多种特定关系的集合

    数据结构的起源

    • 一开始计算机是计算数值用的,所以当人们使用计算机解决实际问题的时候,首先需要从具体问题中抽象出一个适当的数据模型,为了解这个设计模型,需要设计算法,最后才是实现解决该问题的程序,从而得到一个可用的程序。

    • 但是现实生活中,不仅仅是处理数值上的问题,更多的是用程序来做排队取票、复杂计算器的设计、超大整数的求和等等问题,所以更需要有堆、栈、树、表等数据结构的帮助。

    因此数据结构研究的是非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题。

    数据

    • 描述客观事物

    • 计算机中可以操作

    • 能被计算机识别

    • 数据是能够输入给计算机处理的符合集合

    数据元素

    组成数据的,有一定意义的基本单位,在计算机通常作为整体处理,通常也被称为记录。

    水果中的苹果,梨,香蕉;猫和狗是宠物类的数据元素

    数据项

    一个数据元素可以由若干个数据项组成

    数据项是数据不可再分的最小单位。

    针对苹果这个数据元素,可以有大小,颜色这些数据项;

    针对猫这个数据元素,可以有尾巴,足,嘴巴,鼻子,耳朵等数据项。

    数据对象

    是性质相同的数据元素的集合,是数据的子集。

    性质相同指的是数据元素具有相同数据和类型的数据项

    苹果都有大小和颜色等相同的数据项。

    针对上述概念,对数据结构下一个定义

    数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

    排队,可以理解为先到的人先取餐。

    数据元素一种或多种特定的关系指的是什么?

    这包含了逻辑上的关系和物理上的关系

    逻辑结构

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

    集合结构

    类似于数学中的集合,数据元素之间没有别的关系,只是同属一个集合。

    线性结构

    数据元素是一对一的关系

    树形结构

    数据元素是一对多的关系

    图形结构

    数据元素是多对多的关系

    物理结构

    物理结构是指数据的逻辑结构在计算机中的存储形式,如何存储数据元素之间的逻辑关系,是实现物理结构的重点和难点。

    顺序存储结构

    将数据元素存放到地址连续的存储单元里面,其数据间的逻辑关系和物理关系是一致的。顺序存储结构类似于排队,两两之间是十分靠近的。

    链式存储结构

    将数据元素放到任意的存储单元里面,这组单元可以连续也可以不连续。

    链式存储结构类似于银行叫号,人可以站在任何一个地方,只需要关注自己的上一个人就行了。

    抽象数据类型

    数据类型指的是一些值的集合以及针对该集合的一些操作的总称,这些值要求性质相同。

    如1,2,3,45,3435,3443这些都是整数,可以称之为整型。

    抽象数据类型又分为原子类型和结构类型,原子类型指的是不可再分解的基本类型。结构类型是由若干个类型组合而成,是可以再分解的。

    抽象指的是抽取出事物具有的普遍性的本质,抽出问题的特征而忽略细节。

    抽象数据类型是指一个数学模型及定义在这个模型上的一组操作。

    比如一个点,在空间直角坐标系中存在x,y,z坐标,我们可以把点抽象出来,做成一个数据类型。

    问题

    抽象数据类型,抽象类的区别

    抽象数据类型Abstract Data Type,ADT)是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是描述数据结构的一种理论工具,其目的是使人们能够独立于程序的实现细节来理解数据结构的特性。抽象数据类型的定义取决于它的一组逻辑特性,而与计算机内部如何表示无关。

    抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

    通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。

    抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。

     

    展开全文
  • 数据结构:八种数据结构大全!

    千次阅读 多人点赞 2021-07-29 12:36:10
    数据结构 1.1 数据结构概述 数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高...集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系; 2)线性结构 线性
  • 文章目录 首图 前言 文章目录 关键字定义 1、数据 2、数据元素 3、数据项 4、数据对象 关键字定义 1、数据 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号...
  • 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的,但是我们可以使用指针等道具,构造出类似“树形”的复杂结构。下面介绍八个常见的数据结构
  • 数据结构时间复杂度

    千次阅读 2021-01-09 18:55:49
    数据结构的角度分析时间复杂度
  • 数据结构与算法必知基础知识

    千次阅读 多人点赞 2021-01-06 22:58:12
    数据结构与算法是程序员内功体现的重要标准之一,且数据结构也应用在各个方面,业界更有程序=数据结构+算法这个等式存在。各个中间件开发者,架构师他们都在努力的优化中间件、项目结构以及算法提高运行效率和降低...
  • 王道考研数据结构笔记

    万次阅读 多人点赞 2021-04-15 22:43:48
    ##2022王道考研数据结构笔记 第二章 线性表(更新中) 我也看得太慢了吧sos 2.1 线性表的定义和基本操作 要点: 线性表的基本操作——创销、增删、改查 传入参数时,何时要用引用 & 2.2 线性表的顺序表示 ...
  • 数据结构期末速成复习资料 (一)

    千次阅读 2020-12-30 19:49:20
    数据结构是一门研究非数值计算的程序设计问题中计算机的 操作对象 以及它们之间的 关系 和运算等的学科 数据结构被形式地定义为(D, R),其中D是 数据元素 的有限集合,R是D上的 关系 有限集合 数据结构包括数据的 ...
  • 1.数据的逻辑结构是从具体问题抽象出来的数学模型,是描述数据元素及其关系的数学特性的,有时就把逻辑结构简称为数据结构。数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示。2....
  • 数据结构:树(Tree)【详解】

    千次阅读 多人点赞 2021-02-22 10:22:25
    二叉树的顺序存储结构和链式存储结构;二叉树的遍历;线索二叉树的基本概念和构造 树、森林 树的存储结构;森林与二叉树的转换;树和森林的遍历 树与二叉树的应用 二叉排序树;平衡二叉树;哈夫曼树和哈弗编码...
  • 专升本数据结构复习

    千次阅读 多人点赞 2021-03-03 13:48:51
    数据结构知识点总汇 主要参考书目: 程海英老师的《数据结构(C语言版)》教材 严蔚敏,李冬梅,吴伟民.《数据结构(C语言版)》 说明:这是本人专升本上岸一年后写的,本篇包含知识点和例题总结。因为是当时自己...
  • 数据结构大总结!

    千次阅读 2021-11-23 00:23:51
    前几天,小灰给大家介绍了什么是算法。说到算法,就不能不说起数据结构。今天我来讲一讲,什么是数据结构?程序员怎么学好数据结构?我们介绍算法的时候说过,计算机当中的算法,本质就是一系列程序指令...
  • 计算机考研408(数据结构(持续更新))数据结构一、数据结构(一)基本概念:1、数据2、 数据元素(数据基本单位)(由若干数据项组成)(整体)(元素)3、 数据结构:(有关系的数据元素集合)(值集)4、数据对象:(是性质相同...
  • 专升本计算机综合-数据结构

    千次阅读 2021-04-09 23:09:05
    数据结构是计算机中对数据的一种存储和组织方式,同时也泛指相互之间存在一种或多种特定关系的数据的集合。 1.1 什么是数据结构数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种...
  • 数据结构精讲与习题详解

    千次阅读 2020-12-31 08:46:36
    数据结构精讲与习题详解殷人昆电子版本书是清华大学出版社出版的《数据结构(C语言版)》(第2版)的配套教材,对“数据结构”课程常用习题进行了解析,对许多不易通过自学理解的概念和知识做了深入讲解,并针对“数据...
  • 数据结构习题与答案.pdf

    千次阅读 2021-05-19 14:33:19
    第 1 章 绪 论课后习题讲解1. 填空⑴( )是数据的基本单位,在计算机程序中...【解答】数据项,数据元素【分析】数据结构指的是数据元素以及数据元素之间的关系。⑶ 从逻辑关系上讲,数据结构主要分为( )、( )、( )...
  • 30 个重要数据结构和算法完整介绍(建议收藏保存)

    万次阅读 多人点赞 2021-06-07 08:02:06
    数据结构和算法 (DSA)通常被认为是一个令人生畏的话题——一种常见的误解。它们是技术领域最具创新性概念的基础,对于工作/实习申请者和有经验的程序员的职业发展都至关重要。话虽如此,我决定在CSDN新星计划挑战...
  • 数据结构中的有序和无序

    千次阅读 2021-05-13 10:53:54
    数据结构中的有序和无序 文章开头首先感谢正在学C++博主 个人最起始的迷惑 我的迷惑来自有序列表这个名词。 在我的印象中有序的数据结构是可以保留插入顺序的一种数据结构。而无序则是指在插入数据时进行了排序、...
  • 我对八种常见数据结构的理解

    万次阅读 2021-11-22 15:55:35
    Java 中有些集合类就是借鉴了哈希原理构造的,例如 HashMap,HashTable 等 hash 就是找到一种数据内容和数据存放地址之间的映射关系 数据结构的魅力这不就来了吗? 讲到这里,就必须提到 Hash table 的应用了: ...
  • 以下都是小旭大一下学期在家上网课的时候,根据教授所出的试题,一份份手写搞成图片粘进word里面的,现在免费做一个小汇总,主要涵盖了一些简单的介绍和10次...下面小旭先简单地介绍下数据结构的定义、研究对象和意义
  • 什么?程序竟然等于数据结构 + 算法?这个公式是大师 Niklaus Wirth 在 1976 年提出来的,40 多年过去了,这个公式还成立吗?对于做 Java 开发的朋友,可能会更加的赞...
  • 数据结构之顺序表

    千次阅读 2021-02-06 19:23:34
    顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在...通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系...
  • 16 张图带你搞懂 Java 数据结构,从此想不飘都难!

    千次阅读 多人点赞 2021-04-06 11:07:31
    数据结构,也就是 Data Structure,是一种存储数据的结构体,数据与数据之间存在着一定的关系,这样的关系有数据的逻辑关系、数据的存储关系和数据的运算关系。 在 Java 中,数据结构一般可以分为两大
  • 数据结构——图中结点、边和度之间的关系总结

    千次阅读 多人点赞 2021-03-20 17:52:12
    备战蓝桥杯 依旧是二蛋小白的迷惑日常,不会的东西很...从而得出2019个结点具有2019*(2019-1)=4,074,342 答案为:4,074,342 *这些结论无论是在离散数学中还是在数据结构中都是很重要的内容,一定要牢牢地记在心里哦!
  • 第一章 数据结构概述 基本概念与术语 1. 数据:数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被 ...4. 数据结构数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 (1
  • 数据结构--绪论

    2021-01-25 00:04:06
    数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面。T 1-4 数据结构的抽象操作的定义与具体实现有关。F 1-5 算法和程序没有区别,在数据结构中二者是通用的。F 1-6 数据结构包括...
  • 4、结构:逻辑结构:集合结构数据元素之间除了同属于一个集合外,没有其他任何关系线性结构数据元素具有一对一的关系⭐树形结构数据元素具有一对多的关系图形结构数据元素具有多对多的关系存储结构(物理结构...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,581,019
精华内容 632,407
关键字:

关系数据结构

数据结构 订阅