数据结构与算法》(史上最佳总结笔记)
算法
算法基本特征
- 算法:指解题方案的准确而完整的描述(≠程序 ≠计算方法)
- 算法四个特点:
可行性
确定性
有穷性
足够的情报
程序的设计不可能优于算法的设计
有穷性:算法程序的运行时间是有限的,需在有限步骤后终止
算法的基本要素
-
对数据对象的运算和操作:
算术运算
、逻辑运算
、关系运算
、数据传输
-
算法的控制结构
-
算法中各操作之间的执行顺序
-
描述算法的工具:
传统流程图、N-S结构化流程图、自然描述语言、伪代码描述、程序
-
一个算法可以用
顺序、选择(分支) 、循环(重复)
三种基本结构组合而成
-
-
算法的复杂度
-
时间复杂度:执行算法所需要的
计算工作量
(基本运算次数),与所用计算工具无关,与采用的算法描述语言无关,也不取决于算法环境 -
空间复杂度:执行算法所需要的
内存空间
(计算机所需存储空间)
-
时间复杂度:执行算法所需要的
设计算法时需要考虑算法的的时间和空间复杂度,但两者相互独立,毫无关联
- 算法分析方法:平均性态、最坏情况复杂性
- 算法分析目的:降低算法复杂度,提高算法的执行效率,以求改进
- 算法设计方法:
列举法、归纳法、递推、递归、减半递推、回溯
算法的执行效率与数据的存储结构
有关
算法强调动态的执行过程,不同于静态的计算公式
数据结构
数据
-
数据:需要处理的数据元素的集合
-
数据元素:数据的
基本单位
,即数据集合中的个体,也是结点有时一个数据元素可由若干
数据项(Data Item)
组成,数据项是数据的最小单位
-
结构:集合中各数据元素之间存在的某种前后件关系
-
数据结构:指带有结构的相互有关联的数据元素的集合
【真题】设数据集合为D={1,2,3,4,5},则结构B=(D,R)中为非线性结构的是
R={(1,2),(2,3),(4,3),(3,5)} 非线性【1→2→3→5、4→3】(√)
R={(1,2),(2,3),(3,4),(4,5)} 线性【1→2→3→4→5】(×)
数据结构的分类
数据结构作为计算机的一门学科,主要研究三个方面:
数据间固有逻辑结构关系
、数据的存储结构关系
、数据结构的运算
-
逻辑结构:反映数据元素之间的前后件逻辑关系的数据结构(与所使用的计算机无关)
- 线性结构(线性表、栈、队列)
- 非线性结构(树、图、二叉链表)
-
存储结构:即物理结构,数据的逻辑结构在计算机空间中的存放方式(不同的存储结构,数据处理的效率不同,
与效率有关
)-
顺序结构:主要用于线性的数据结构
-
链式结构:每一个结点至少包含一个指针域,用指针的指向来体现数据元素之间在逻辑上的联系 ,优点是
便于插入和删除操作
-
索引结构:带有目录与内容
没有根结点或没有叶子结点的数据结构一定是非线性结构。
所有数据结构不用必须有根结点或终端结点。
-
- 运算:插入、删除、查找、排序
线性表
-
线性表:由n(n≥0)个数据元素构成的有限序列,表中由且只有一个根结点和一个终端结点,除根元素外的其它元素有且只有一个前件,除终端元素外的其它元素有且只有一个后件(如:春→夏→秋→冬)
-
线性表的顺序存储结构叫做
顺序表
(随机存取),线性表的链式存储结构叫做线性链表
(顺序存取)
顺序表
- 线性表中所有元素所占的存储空间是
连续
的 - 线性表中数据元素在存储空间中是
按逻辑顺序依次存放
的 - 可以
随机访问
数据元素 - 做插入、删除时需移动大量元素,因此线性表不便于插入和删除元素
- 其存储空间连续,各个元素所占字节数相同,元素的存储顺序与逻辑顺序一致
线性链表
- 各数据结点的存储空间可以
不连续
- 各数据元素的存储顺序与逻辑顺序可以不一致,
可任意
- 所占存储空间
大于
顺序存储结构(每节点多出至少一个指针域) - 查找结点时要比顺序存储
慢
- 插入删除元素比顺序存储
灵活
- 线性链表的操作:在线性链表中进行插入与删除,
不需要
移动链表中的元素
栈
-
栈的入口和出口是
同一个口
,只能在栈顶
进行插入和删除
-
栈的修改原则是
“先进后出”
或“后进先出”
-
栈的
栈底指针bottom
和栈顶指针top
,从入栈
到栈满
再到退栈
,栈低指针bottom不变
,栈中元素随栈顶指针的变化而动态变化(指针存放的是地址而非数据) -
栈能临时保存数据,具有
记忆功能
-
栈支持子程序调用
一个栈的初始状态为空。将元素abcde依次入栈,不可能的出栈顺序为(E)
A.edcba B.dcbae C.badce D.cbaed E.eabcd
用一个长度为50的数组(数组元素的下标从0到49)作为栈的存储空间,如果bottom=49,top=30(数组下标),则栈中具有的元素个数为【20】(49-30+1=20)
设栈的存储空间为S(1:60),初始状态为top=61。现经过一系列正常的入栈与退栈操作后,top=25,则栈中的元素个数为【36】(60-25+1=36)
栈内元素个数计算:
丨Top-Bottom丨+1
(其中Bottom≥1),若T=B=0说明栈空
链式栈较特殊,当中存放元素与地址,但其栈底指针可以改变但不能省略
与顺序栈相比的优点:入栈操作时不会受栈存储空间的限制而发生溢出,不受空间大小的限制,不需要考虑栈满的问题
队列
- 队列中
队头指针front
指向对头元素的前一位置
,队尾指针rear
指向最末元素,从入队
到出队
- 队列的入口和出口
非同一个口
,只允许在队尾插入
,而在队头删除
- 队列的修改原则是
“先进先出”
或“后进后出”
(先到先服务的作业调度) - 队列中元素随front和rear的变化而动态变化,并非固定
循环队列
- 将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用
求队列中的
元素个数s
(由rear与front共同决定)
- rear>front s=rear-front . rear<front s=rear-front+总容量 . rear=front s=0或者s=容量(满)
设循环队列的存储空间为Q(1:40),初始状态为front=rear=40。经过一系列正常的入队与退队操作后,front=rear=15,此后又正常地退出了一个元素,则循环队列中的元素个数为 【39】 (当头尾指针都是15之后还能退出元素,说明初始状态为满,故退出一个元素,即40-1=3)
树
- 树:指n(n>0)个元素的有限集合,它有且仅有一个称为根的元素,其余元素是互不相交的子树
-
概念术语:
- 父结点(A是BCD的父)、子结点(BCD是A的子)
- 根结点(A)、叶子结点(KLFMHNJ)
- 结点的度:一个结点所拥有的后件的个数(A的度为3、B的度为2)
- 树的度:具有结点中最大的度(上图为3)
- 树的深度:整棵树的层数(上图为4)
- 子树:在一棵树中以某个结点的一个子结点为根所构成的树(如B→EF→KL这一左半部分)
二叉树
二叉树是一个有限的结点集合,该集合或为空,或由一个根结点及其两棵互不相交的左右二叉子树所组成,
二叉链表
是树的二叉链表实现方式。
-
二又树的特点
- 非空二又树只有一个根结点
- 每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树
-
特殊二叉树
满二叉树:除最后一层外,每一层上的结点数均达到最大值。
完全二叉树:除最后一层外,每一层上的结点数均达到最大值,在最后一层上只缺少右边的若干结点
满二叉树
是
完全二叉树,完全二叉树不是
满二叉树
-
二叉树的性质:
- 非空二叉树只有一个根结点,每个结点最多有两棵子树,分别称为
左子树
和右子树
- 在二叉树的第k层上,最多有
2^(k-1)
个结点(指定第几层求结点) - 深度为m的二叉树最多有
2^(m)-1
个结点(指定层数求结点) - 度为0的结点称为
叶子结点
,度=0的结点总比度=2的结点多1个
- 有n个结点的二叉树深度至少为
[log(2)n]+1
(指定结点求深度)
- 非空二叉树只有一个根结点,每个结点最多有两棵子树,分别称为
-
二叉树的遍历:按照一定的顺序不重复不遗漏地访问二叉树中的结点
前序遍历:访问根结点→前序遍历左子树→前序遍历右子树(ABDGECF)(根左右) 中序遍历:中序遍历左子树→访问根结点→中序遍历右子树(DGBEACF)(左根右) 后序遍历:后序遍历左子树→后序遍历右子树→访问根结点(GDEBFCA)(左右根)
查找技术
-
顺序查找:从第一个或最后一个记录开始,一直到查找出给定值,结束查找
-
二分查找:在有序表中取中间记录作为比较对象,若给定值与中间记录的关键字相等,查找成功;若小于则找左半区,若大于则找右半区,不断重复直到成功
注意:即使是有序线性表,如果采用链式存储结构,也只能用顺序查找
排序
- 冒泡排序:从头到尾重复比较相邻的两元素,如果前比后大,就交换彼此,直到没有相邻元素需要交换则完成排序,越大的元素会经交换慢慢“浮”到数列的后端
- 快速排序:选第一个数作为基准数,将之后所有的数与其做比较,比基大放右区,比基小放左区,此时线性表被分割为两个子表,再对两个子表重复上述步骤,直到各字表的长度为1则完成排序
- 简单插入排序:将无序序列中的各元素依次插入到已经有序的线性表中,像军训时按身高逐个纠正排序
- 希尔排序:将整个无序序列分割成若干小的子序列分别进行简单插入排序
- 简单选择排序:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面,以此类推直到所有元素均排序完毕
- 堆排序:选建堆,然后将堆顶元素与堆中最后一个元素交换,再调整为堆
最坏情况下,**比较次数最少(时间复杂度最低)**的是
堆排序
要求内存量最大的是
归并排序
当数据表中每个元素距其最终位置不远,最节省时间的是
简单插入排序
选择排序与冒泡排序的区别:冒泡排序通过依次交换相邻两个顺序不合法的元素位置,从而将当前最小(大)元素放到合适的位置;而选择排序每遍历一次都记住了当前最小(大)元素的位置,最后仅需一次交换操作即可将其放到合适的位置。
程序设计基础
程序设计方法与风格
-
相关术语
- 程序:将计算机语言代码依据一定的语法规则,描述为完成特定任务的算法的指令序列,程序执行的效率与数据的存储结构密切相关
- 程序设计:程序设计为完成一项程序工作的过程
- 计算机语言:计算机语言是人与计算机交流的工具
- Wirth公式:算法+数据结构=程序
-
良好的程序设计风格:
清晰第一,效率第二
-
源程序内部文档化
- 选择标识符的名字
- 程序的视觉组织
- 程序的注释
- 功能性注释:位于模块内部,用于描述其后语句或程序主要功能
- 序言性注释:位于模块首部,用于说明模块的相关信息(程序的标题 功能的说明 主要的算法 模块接口 开发历史 程序设计者 复审者 复审日期 修改日期)
- 数据说明
- 数据说明的次序规范化
- 说明语句中变量安排有序化
- 使用注释来说明复杂数据的结构
- 语句的结构
- 在一行内只写一条语句
- 程序编写应优先考虑清晰性
- 程序编写要做到清晰第一,效率第二
- 在保证程序正确的基础上再要求提高效率
- 避免使用临时变量而使程序的可读性下降
- 避免不必要的转移
- 尽量使用库函数
- 避免采用复杂的条件语句
- 尽量减少使用“否定”条件语句
- 数据结构要有利于程序的简化
- 要模块化,使模块功能尽可能单一化
- 利用信息隐蔽,确保每一个模块的独立性
- 从数据出发去构造程序
- 不要修补不好的程序,要重新编写
- 输入和输出
- 对输入数据检验数据的合法性
- 检查输入项的各种重要组合的合法性
- 输入格式要简单,使得输入的步骤和操作尽可能简单
- 输入数据时,应允许使用*格式
- 应允许缺省值
- 输入一批数据时,最好使用输入结束标志
- 在以交互式输入/输出方式进行输入时,要在屏幕上使用提示符明确提示输入的请求,同时在数据输入过程中和输入结束时,应在屏幕上给出状态信息
- 当程序设计语言对输入格式有严格要求时,应保持输入格式与输入语句的一致性,给所有的输出加注释,并设计输出报表格式
-
良好程序设计风格不仅有助于提高程序的可靠性、可理解性、可测试性、可维护性和可重复性,而且也能够促进技术的交流,改善软件的质量
结构化程序设计
-
软件设计的基本原则:抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性、可靠性
-
结构化程序设计风格:
程序结构良好、易读性好、易测试、易维护
(最强调的是易读性) -
结构化程序设计原则
-
自顶向下
:先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标 -
逐步求精
:对复杂问题,先设计一个目标作为过渡,然后逐步细化 -
模块化
:把程序要解决的总目标分解为一个一个的模块 -
限用goto语句
:程序的质量与goto语句数量成反比
-
-
结构化程序的基本结构:
顺序
、选择(分支)
、循环(重复)
-
程序设计语言的基本成分:
数据成分
、运算成分
、控制成分
、传输成分
设计程序时,应采纳的原则之一是程序结构应有助于读者理解(强调
程序易读性
)
面向对象的程序设计
- 面向对象方法的主要优点
- 与人类习惯的思维方法致
- 稳定性好
- 可重用性好
- 易于开发大型软件产品
- 可维护性好
与传统的的面向过程的方法不同之处:
面向对象的程序设计主张从客观世界固有的物质出发来构造系统,
使用现实世界的概念抽象地思考问题从而自然地解决问题
,它提倡用人类在现实生活中常用的思维方式来认识理解描述客观事物
-
对象有关概念术语
- 对象:在现实世界中,每个实体都是对象(大学生、汽车、电视机、空调)
- 属性:用于描述对象的状态
- 方法:用于描述对象的行为
- 类:一组具有相同属性和相同操作的对象的集合
- 消息:是一个实例与另一个实例之间传递的信息,
对象间的通信靠消息传递
- 接收消息的对象的名称
- 消息标识符,也称消息名
- 零个或多个参数
-
对象的基本特点
-
标识唯一性
:对象可由内在本质来区分,而不是通过描述来区分 -
分类性
:可以将具有相同属性和操作的对象抽象
成类 -
多态性
:同一操作可以是不同对象的行为,同样的消息被不同对象接受时可导致完全不同的行为的现象 -
封装性
:从外面看不到对象的内部,只能看到对象外部特征,实现信息隐蔽
,是数据与操作的结合
,是属性与方法的封装
-
模块独立性好
:对象是面向对象的软件的基本模块,高内聚低耦合 -
继承性
:使用已有的类建立新类的定义技术,能直接获得已有的性质,而不必重复定义他们,是类之间共享属性和操作的机制
-
依赖性
:某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用
-
“
对象是属性和方法的封装体
”、“任何对象不一定有继承性
”“
对象是类的具体实例,类是对象的抽象
”、“操作是对象的动态属性
”基于同一类产生的对象可以分别设置各自的属性,对象中的属性只能通过该对象所提供的操作来存取或修改
软件工程基础
软件工程基本概念
-
软件:指计算机系统中与硬件相互依存的另一部分,包括程序、数据和相关文档的完整集合,特点是
- 软件是一种逻辑实体,具有抽象性;
- 软件的生产与硬件不同,它没有明显的制作过程;
- 软件在运行、使用期间不存在磨损、老化问题;
- 软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致了软件移植的问题;
- 软件复杂性高,成本昂贵;
- 软件开发涉及诸多的社会因素。
-
软件分类:
-
系统软件:操作系统、编译程序、汇编程序、网络软件、数据库管理系统
-
应用软件:事务处理软件、工程与科学计算软件、实时处理软件、人工智能软件、财务管理系统
-
支撑软件(工具软件):需求分析工具软件、编译工具软件、测试工具软件、维护工具软件、Word编辑软件
学生成绩管理系统、教务管理系统属于应用软件
-
-
软件危机:需求增长、开发难控、质量难保、难以维护、成本提高、生产率低
-
软件生命周期
:将软件产品从提出、实现、使用维护到停止使用退役的过程分为3个时期8个阶段,维护是持续时间最长,花费代价最大的一个时期
- 软件定义阶段:①问题定义可行性研究、②需求分析
- 软件开发阶段:③概要设计、④详细设计、⑤实现、⑥测试
- 软件运行维护阶段:⑦使用、⑧维护
-
软件工程:应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序
-
目的
:提高软件生产率/质量/可维护性,降低软件成本; -
核心思想
:把软件当作一个工程产品来处理 - 软件工程的三要素
- 方法:完成软件工程项目的技术手段
- 工具:支持软件的开发、管理和文档生成
- 过程:支持软件开发的各环节的控制和管理
-
原则
:抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性、可验证性
-
-
需求分析:确定系统的逻辑模型。参加人员有用户、项目负责人和系统分析员
- 需求分析的工作:需求获取、需求分析、编写需求规格说明书、需求评审
- 需求分析阶段产生的主要文档为
需求规格说明书
(SRS),其作用为- 便于用户、开发人员进行理解交流
- 反映用户问题的结构,可以作为软件开发工作的基础和依据
- 作为确认测试和验收的依据
- 说明书的特点:有正确性、无歧义性、完整性、可验证性、一致性、可理解性、可修改性和可追踪性。其中最重要的是无歧义性。
结构化分析方法
-
需求分析方法
包括结构化需求分析方法
、面向对象的分析方法
-
结构化分析方法
是一种使用数据流图(DFD)、数据字典(DD)、判定表和判定树等工具,来建立系统的逻辑模型。 -
数据流图(DFD)是结构化方法的需求分析工具,其图形元素:
-
〇 加工
:输入数据经加工变换产生输出 -
→ 数据流
:沿箭头方向传递数据的通道 -
= 存储文件(数据源)
:存放各种数据的文件 -
☐ 源(潭)
:系统和环境的接口
-
-
数据字典(DD):对数据流图中所有元素定义的集合,它是结构化分析的核心。
软件设计
-
软件设计是确定系统的物理模型,软件设计的
基本目标
是用比较抽象、 概括的方式确定目标系统如何完成预定的任务。 -
软件设计的划分(阶段)
- 按工程管理角度划分:概要设计、详细设计
- 按技术观点划分:结构设计、数据设计、接口设计、过程设计
-
软件设计基本原理
-
抽象化
:在软件设计中,可以定出多个抽象级别,抽象层次从概要设计到详细设计逐步降低。 -
模块化
:把一个待开发的软件分解成若干小的简单的部分,自顶向下逐层把软件划分成若干模块。 -
信息隐蔽和局部化
:一个模块内的信息,对于不需要这些信息的其他模块来说不能访问。 -
模块独立性
:每个模块只完成独立的子功能,并且与其他模块的联系少且接口简单。模块的独立程度是评价设计好坏的重要度量标准。
-
-
软件模块独立性
-
高内聚性
:指一个模块内部各个元素间彼此结合的紧密程度 -
低耦合性
:指模块间互相连接的紧密程度
耦合包括非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合、内容耦合(耦合度逐渐增强)
-
结构化设计方法
-
概要设计
的任务:划分出组成系统的物理元素、设计软件的结构- 常用工具:
程序结构图(SC)
- 基本图形:
☐ 一般模块
、〇→ 数据信息
、●→ 控制信息
- 结构图的四种模块类型:传入模块、传出模块、变换模块、协调模块
- 常用工具:
系统结构图
- 最大扇入数:系统图中进入某一节点的最大节点数
- 宽度:指整体控制跨度,即横向最大模块数
- 深度:从最顶层出发延伸最长的层数
上图的最大扇入数为n,宽度为5,深度为3
-
详细设计
的任务:确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。- 常用工具:
- 图形工具:程序流程图、N-S图、PAD、HIPO
- 表格工具:判定表
- 语言工具:PDL(伪码)
- 程序流程图的基本图形:
→ 控制流
、☐ 加工步骤
、◇ 逻辑条件
- 常用工具:
软件测试
-
软件测试的
目的
:发现程序中的错误 -
软件测试的
准则
- 所有测试都应追溯到用户需求
- 在测试之前制定测试计划,并严格执行
- 充分注意测试中的群集现象
- 避免由程序的编写者测试自己的程序
- 不可能进行穷举测试
- 妥善保存测试分析报告,为维护提供方便
-
软件测试的
方法
-
按是否需要执行
- 静态测试:不实际运行软件,通过人发挥思维优势发现程序的错误
- 动态测试:基于计算机的测试,是为了发现错误而执行程序的过程
-
按功能
-
白盒测试:把测试对象看作一个打开的盒子,利用程序内部的逻辑结构,对程序所有逻辑路径进行测试,白盒测试针对程序的内部逻辑结构
方法:
逻辑覆盖测试
(条件/分支/语句覆盖)、基本路径测试
-
黑盒测试:完全不考虑程序内部的逻辑结构,只检查程序是否能接收输入数据而产生正确的输出信息,黑盒针对程序的外部功能
方法:
等价类划分法
、边界值分析法
、错误推测法
、因果图
-
-
-
软件测试的
步骤实施
- 单元测试:对软件设计的最小单位——模块进行测试,目的是发现各模块内部的错误。
- 集成测试:把模块按照设计要求组装起来的同时进行测试,目的是发现与接口有关的错误。
- 确认测试:验证软件的功能和性能是否满足各种需求,以及软件配置是否完全、正确。
- 系统测试:将软件作为一个元素,与计算机系统其他元素组合在一起,进行集成测试。
【真题】软件测试用例包括——输入数据和预期输出结果
程序调试
-
程序调试是对程序进行了成功的测试之后将进入程序调试,通常称为Debug(排错),主要在开发阶段进行。
-
程序调试的
任务
:诊断和改正程序的错误 -
程序调试的
基本步骤
- 错误定位
- 修改设计和代码,以排除错误
- 进行回归测试,防止引进新的错误
-
程序调试的
方法
:强行排除法
、回溯法
、原因排除法
数据库设计基础
数据库基本概念
-
数据(data):描述事物的符号记录
-
数据库(Database):数据的集合,具有
统一的结构形式
并存放于统一的存储介质
内,是多种应用数据的集成,并可被各个应用程序所共享数据库中的数据具有两大特点:
“集成”
与“共享”
数据库技术的根本目标:
解决数据共享问题
-
数据库管理系统(DBMS):数据库的机构,一种
系统软件
,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务,它是数据库系统的核心
- 数据定义语言(DDL,Definition):数据模式定义、数据存取的物理构建
- 数据操纵语言(DML,Manipulation):数据操纵(包括
查询
与增、删、改等操作) - 数据控制语言(DCL,Control):数据的完整性、安全性的定义与检查、并发控制、故障恢复
- 数据查询语言(DQL,Query):集数据定义、操纵和控制功能于一体的数据库语言,是数据库的核心语言, 具有操作所有关系型数据库管理系统的能力
-
数据库管理员(DBA):主要工作包括
数据库规划、设计、维护、监视
,改善系统性能、提高系统效率
-
数据库应用系统(DBAS):利用数据库系统进行应用开发可构成一个数据库应用系统,它是专门为一类用户设计的系统,不具有通用性,由
数据库系统
、应用软件
以及应用界面
组成 -
数据库系统(DBS)的组成
- 数据库(数据)
- 数据库管理系统DBMS(软件)
- 数据库管理员DBA(人员)
- 软件平台
- 硬件平台
-
数据库系统的特点:高集成性、
高共享低冗余
、物理独立性与逻辑独立性
、统一管理与控制数据独立性是数据与程序间的互不依赖性,即数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序,==在数据系统中,数据的物理结构并不一定与逻辑结构一致==
逻辑独立性——指用户的应用程序与数据库的逻辑结构是相互独立的,即当数据的逻辑结构改变时,用户程序也可以不变,当数据库中数据总体逻辑结构发生变化,而应用程序不受影响
-
数据库系统的内部结构体系
- 三级模式
- 概念模式(概念数据库):全局数据逻辑结构的描述,即全体用户的公共数据视图
- 外模式(用户数据库):又称子模式或用户模式,即用户的数据视图,反映用户对数据的要求
- 内模式(物理数据库):
给出数据库物理存储结构与存取方法
,反映数据在计算机物理结构上的实际存储形式,如数据存储的文件结构、索引
、集簇及hash等存取方式与存取路径
- 二级映射
-
外模式/概念模式的映射:实现了外槿式到概念模式之间的相互转换(当逻辑模式发生变化时,通过修改相应的外模式/逻辑模式映射,使得用户所使用的那部分外模式不变,从而应用程序不必修改,保证数据具有较高的逻辑独立性)
-
概念模式/内模式的映射:实现了概念模式到内模式之间的相互转换(当数据库的存储结构发生变化时,通过修改相应的概念模式/内模式的映射,使得数据库的逻辑模式不变,其外模式不变,应用程序不用修改,从而保证数据具有很高的物理独立性)
-
三级模式反映了模式的三个不同环境及其他们的不同要求
两级映射保证了数据库中数据具有较高的逻辑独立性和物理独立性
- 三级模式
-
数据管理发展的三个阶段:
人工管理 → 文件系统 → 数据库系统
在数据管理技术发展过程中,文件系统与数据库系统的主要区别是数据库系统具有
特定的数据模型
数据模型
-
数据模型:数据库设计的
核心
-
数据模型的三要素
数据结构
:描述数据的类型、内容、性质以及数据间的联系数据操作
:描述在相应数据结构上的操作类型与操作方式数据约束
:描述数据结构内数据间的语法、语义联系,它们之间的制约与依存关系用计算机表示每一个实体时,由其所有信息项组成一条
记录
,相应于属性的数据称为数据项
实体内部的联系反映在数据上是数据项之间的联系,实体间的联系反映在数据上是记录间的联系 实体与属性有“型“与“值”之分,型是指结构(对应行),值是指结构约束下的具体取值(对应列)
-
数据模型按不同的应用层次
-
概念数据模型(概念模型):E-R模型、谓词模型
-
逻辑数据模型(数据模型):层次模型、网状模型、关系模型
-
物理数据模型(物理模型):面向计算机物理结构的模型
概念数据模型——用于对客观世界中复杂事物的结构及它们之间的联系进行描述,与具体的数据库管理系统无关,与具体的计算机平台无关
逻辑数据模型——面向数据库系统、
考虑数据库实现
的模型,着重于在数据库系统一级的实现 -
数据模型实例
-
E-R模型:实体联系模型,由实体、联系、属性组成
E-R模型图形符号:
☐ 实体
、〇 属性
、◇ 联系
、— 联接关系
实体集间的相互关系:
一对一、一对多、多对一、多对多
-
层次模型:最早发展起来的数据库模型,如
树
层次模型的特点:
- 每棵树有且仅有一个无双亲结点,称为根
- 树中除根外所有结点有且仅有一个双亲
-
网状模型:一个不加任何条件限制的
无向图
-
关系模型:以
二维表
为基本结构所建立的模型,由表框架及表元组构成,表框架由n个命名的属性组成,n称为属性元数
层次型、网状型、关系型数据库的划分原则是
数据之间的联系方式
二维表
-
二维表的概念:用来表示实体间联系,每一个二维表称为一个
关系
,为了建立一个关系,首先要指定关系的属性-
属性:二维表中的一
列
,每个属性的取值范围称为值域(一个关系的属性名表称为该关系的关系模式
,其记法为<关系名>(<属性名1>,<属性名2>,…,<属性名n>)
) -
元组:二维表中的一
行
(各元组的每一个分量
是表示最小单位
的基本数据项,分量不可再分) -
主键:也称
关键字
、主码
,其值能唯一
标识表中一个元组,主码属性不能取空 -
外键:也称
外部关键字
,在一个关系中含有与另一个关系的关键字相对应的属性组,表的外键是另一表的主键,外键可重复、可空值例:在关系A(S,SN,D)和B(D,CN,NM)中,A的主键是S,B的主键是D,则D是A的外键
-
-
关系中的数据约束
-
实体完整性约束
:要求关系的主键中属性值不能为空值,为主键是唯一决定元组的,若属性为空值则其唯一性就无意义了,即一个关系中应有一个或多个
候选关键字 -
参照完整性约束
:这是关系之间相互关联的基本约束,不允许关系引用不存在的元组
,即在关系中的外键要么是所关联关系中实际存在的元组,要么为空值 -
用户定义的完整性约束
:反映某一具体应用所涉及的数据必须满足的语义要求,例如某个属性的取值范围在0-100之间
-
-
关系的特点
- 关系必须规范化
- 在同一个关系中不能出现相同的属性名
- 关系中不能有相同的元组
- 在一个关系中
元组的次序
无关紧要,任意交换两行位置并不影响数据的实际含义 - 在一个关系中
属性的次序
无关紧要,任意交换两列位置也不影响数据的实际含义
关系代数
-
关系模型的基本操纵:增加、删除、修改、查询
-
并 R∪S
:将两个以上表的行并到一起,去除相同的行 -
差 R-S
:在关系R中减去关系S共有的行,保留的是S中没有的行,运算时依次将两个表的一行一行相减 -
笛卡儿积 R×S
:行与列重新组合 -
投影 π
:从所有字段中选取一部分字段及其值进行纵向操作(选列) -
选择 σ
:从二维表的全部记录中把那些符合指定条件的记录挑出来(选行) -
连接 R⋈S(AƟB)
:将两个关系模式拼接成一个更宽的关系模式,在新的关系上做选择操作,生成的新关系中包含满足联接条件的元组 -
交 R∩S
:求两个以上表的公共行,前提是参与运算的表的结构相同 -
除 T=R÷S
(笛卡儿反运算):行与列重新拆分,剩下的合并相同行 -
自然连接 R⋈S
:一种特殊的等值链接,把对应字段取值相等的元组连接成一个新的表,剩下的去掉属性重复的列,要求R和S含有一个或多个共有的属性
说明:
笛卡尔积——若R有m个元组,S有n个元组,则R×S有m×n个元组
投影——C和A为属性名,说明要选择的列
选择——B>'4'是选择语句的条件,对关系做水平分割,选择符合条件的元组
交运算
能不改变关系表中的属性个数但能减少元组个数 -
数据库设计与管理
-
数据库设计:设计一个能满足用户要求,性能良好的数据库,它是
数据库应用系统中的核心问题
-
基本任务:根据用户对象的信息需求、处理需求和数据库的支持环境设计出数据模式
-
两种方法
- 面向数据的方法:以信息需求为主,兼顾处理需求(主流)
- 面向过程的方法:以处理需求为主,兼顾信息需求
-
-
数据库设计的步骤:(一般采用生命周期法)
-
需求分析阶段——包括信息/处理/安全性/完整性的需求,建立数据字典
-
概念设计阶段——分析数据间内在语义的关联建立抽象模型,
用E-R图来描述信息结构
但不涉及信息在计算机中的表示
-
逻辑设计阶段——
把E-R图转换为关系模式
(实体与联系表示成关系
,属性转换成关系中的属性
) -
物理设计阶段——对数据库内部物理结构作调整并选择合理的存取路径,以提数据库访问速度及有效利用存储空间,包括优化数据库系统查询性能的
索引设计
、集簇设计
和分区设计
-
编码阶段
-
测试阶段
-
运行阶段
-
进一步修改阶段
在数据库设计中最多采用
前四个阶段
,并且重点以数据结构与模型的设计为主线 -
-
数据库管理
- 数据库的建立
- 数据库的调整
- 数据库的重组
- 数据库安全性控制与完整性控制
- 数据库的故障恢复
- 数据库监控
推荐阅读
-
数据结构与算法》(史上最佳总结笔记)
-
浙江大学陈越先生的《数据结构与算法》课程笔记
-
day11 | 数据结构与算法 | 第三届 ByteDance 青年营笔记
-
反传销网8月30日发布:视频区块链里的骗子,币里的韭菜,杜子建骂人了!金融大V周召说区块链!——“一小帮骗子玩一大帮小白,被割韭菜,小白还轮流被割,割的就是你!” 什么区块链,统统是骗子 作者:周召(知乎金融领域大V,毕业于上海财经大学,目前任职上海某股权投资基金合伙人) 有人问我,区块链现在这么火,到底是不是骗局? 我的回答是: 是骗局。而且我并不是说数字货币是骗局,而是说所有搞区块链的都是骗局。 -01- 区块链是一种鸡肋技术 人类社会任何技术的发明应用,本质都是为了提高社会的生产效率。而所谓区块链技术本质不过是几种早已成熟的技术的大杂烩,冗余且十分低效,除了提高了洗钱和诈骗的效率以外,对人类社会的进步毫无贡献。 真正意义上的区块链得包含三个要素:分布式系统(包括记账和存储),无法篡改的数据结构,以及共识算法,三者互为基础和因果,就像三体世界一样。看上去挺让人不明觉厉的,而经过几年的瞎折腾,稍微懂点区块链的碰了几次壁后都已经渐渐明白区块链其实并没有什么卵用,区块链技术已经名存实亡,沦为了营销工具和传销组织的画皮。 因为符合上述定义的、以比特币为代表的原教旨区块链技术,是反效率的,从经济学角度来说,不但不是一种帕累托改进,甚至还可以说是一种帕累托倒退。 原教旨区块链技术的效率十分低下,因为要遍历所有节点,只能做非常轻量级的数据应用,一旦涉及到大量的数据传输与更新,区块链就瞎了。 一方面整条链交易速度会极慢,另一方面数据库容量极速膨胀,考虑到人手一份的存储机制,区块链其实是对存储资源和能源的一种极大的浪费。 这里还没有加上为了取得所谓的共识和挖矿消耗的巨大的能源,如果说区块链技术是屎,那么这波区块链投机浪潮可谓人类历史上最大规模的搅屎运动。 区块链也验证不了任何东西。 所谓的智能合约,即不智能,也非合约。我看有人还说,如果有了智能合约,就可以跟老板签一份放区块链上,如果明年销售业绩提升30%,就加薪10%,由于区块链不能篡改,不能抵赖,所以老板必须得执行,说得有板有眼,不懂行的愣一看,好像还真是那么回事。 但仔细一想,问题就来了。首先,在区块链上如何证明你真的达到了30%业绩提升?即便真的达到老板耍赖如何执行? 也就是说,如果区块链真这么厉害,要法院和仲裁干什么。 人类社会真正的符合成本效益原则的是代理制度。之前有人说要用区块链改造注册会计师行业,我不知道他准备怎么设计,我猜想他思路大概是这样的,首先肯定搞去中心化,让所有会计师到链上来,然后一个新人要成为注册会计师就要所有会计师同意并记录在链上。 那我就请问了,我每天上班累死累活,为什么还要花时间去验证一个跟我无关的的人的专业能力?最优做法当然是组织一个委员会,让专门的人来负责,这不就是现在注册会师协会干的事儿吗?区块链的逻辑相当于什么事情都要拿出来公投,这个绝对是扯淡的。 当然这么说都有点抬举区块链了,区块链技术本身根本没有判断是非能力,如果这么高级的人工智能,靠一个无脑分布式记账就能实现的话,我们早就进入共产主义社会了。 虽然EOS等数字货币采用了超级节点,通过再中心化的方式提高效率,有点行业协会的意思,是对区块链原教旨主义的一种修正,但是依然无法突破区块链技术最本质的局限性。有人说,私有链和联盟链是区块链技术的未来,也是扯淡,因为区块链技术没有未来。如果有,说明他是包装成区块链的伪区块链技术。 区块链所涉及的所有底层技术,不管是分布式数据库技术,加密技术,还是点对点传输技术等,基本都是早已存在没什么秘密可言的技术。 比特币系统最重要的特性是封闭性和自洽性,他验证不了任何系统自身以外产生的信息的真实性。 所谓系统自身产生的信息,就是数据库数据的变动信息,有价值的基本上有且只有交易信息。所以说比特币最初不过是中本聪一种炫技的产物,来证明自己对几种技术的掌握,你看我多牛逼,设计出了一个像三体一样的系统。因此,数字货币很有可能是区块链从始至终唯一的杀手应用。 比特币和区块链概念从诞生到今天已经快10年了,很多人说区块链技术在爆发的前夜,但这个前夜好像是不是有点过长了啊朋友,跟三体里的长夜有一拼啊。都说区块链技术像是90年代初的互联网,可是90年代初的互联网在十年发展后,已经出现了一大批伟大的公司,阿里巴巴在99年都成立了,区块链怎么除了币还是币呢? 正规的数字货币未来发展的形式无外乎几种,要么就是论坛币形式,或者类似股票的权益凭证等。问题是论坛币和股票之前,本来也都电子化了,区块链来了到底改变了什么呢? 所有想把TOKEN和应用场景结合起来的人最后都很痛苦,最后他们会发现区块链技术就是脱裤子放屁,自己辛苦搞半天,干嘛不自己作为中心关心门来收钱?最后这些人都产生了价值的虚无感,最终精神崩溃,只能发币疯狂收割韭菜,一边嘴里还说着我是个好人之类的奇怪的话。 因此,之前币圈链圈还泾渭分明,互相瞧不起,但这两年链圈逐渐坐不住了,想着是不是趁着泡沫没彻底破灭之前赶快收割一波,不然可能什么都捞不着了。 前段时间和一个名校毕业的链圈朋友瞎聊天,他说他们“致力于用区块链技术解决数字版权保护问题”,我就问他一个问题,你们如何保证你链的版权所有权声明是真实的,万一盗版者抢先一步把数据放在链上怎么办。他说他们的解决方案是连入国家数字版权保护中心的数据库进行验证…… 所以说区块链技术就是个鸡肋,研究到最后都会落入效率与真实性的黑洞,很多人一头扎进链圈后才发现,真正意义上的区块链技术,其实什么都干不了。 -02- 不是蠢就是坏的区块链媒体 空气币和区块链的造富神话,让区块链自媒体也开始迎风乱扭。一群群根本不知道区块链为何物的妖魔鬼怪纷纷进驻区块链自媒体战场,开始大放厥词胡编乱造。 任何东西,但凡只要和区块,链,分,分布式,记账,加密,验证,可追溯等等这些个关键词沾到哪怕一点点,这些所谓的区块链媒体人就会像狗闻到了屎了一样疯狂地把区块链概念往上套。 这让我想起曾经一度也是热闹非凡的物联网,我曾经去看过江苏一家号称要改变世界的“物联网”企业,过去一看是生产路由器的,我黑人问号脸,对方解释说没有路由器万物怎么互联,我觉得他说得好有道理,竟无言以对。 好,下面让我们进入奇葩共赏析时间,来看看区城链媒体经常有哪些危言耸听的奇谈怪论 区块链(分布式记账)的典型应用是*?? 正如前面所说,真正意义上的区块链分布式记账,不光包括“记”这个动作,还包括分布式存储和共识机制等。而*诞生远远早于区块链这个词的出现,勉强算是“分布式编辑”吧,就被很多区块链媒体拿来强行充当区块链技术应用的典范。 其实事实恰恰相反,*恰恰是去中心化失败的典范,现在如果没有精英和专业人士的编辑和维护,*早就没法看了。 区块链会促进社会分工?? 罗振宇好像就说过类似的话,虽然罗振宇说过很多没有逻辑的话,但这句话绝对是最没逻辑思维的。很多区块链自媒体也常常用这句话来忽悠老百姓,说分工代表效率提高社会进步,而区块链“无疑”会促进分工,他们的理由仅仅是分工和分布式记账都共用一个“分”字,就强行把他们扯到一起。 实际情况恰恰相反,区块链是逆分工的,区块链精神是号召所有人积极地参与到他不擅长也不想掺合的事情里面去。 区块链不能像上帝一样许诺他的子民死后上天国,只能给他们许诺你们是六度人脉中的第一级,我可以赚后面五级人的钱,你处于金字塔的顶端。
-
【算法与数据结构】回溯算法、贪心算法、动态规划、图论(笔记三)-十、图论
-
数据结构与算法之美学习笔记:48 | B+树:MySQL数据库索引是如何实现的?-总结引申
-
《数据结构与算法》解读:字节3-1级别大佬详解,并提供源码笔记