算法、数据库的基础知识_数据库算法_Lygjhr的博客
算法、数据库的基础知识
算法、数据结构基本概念
1.算法是指对解题方案的准确而完整的描述，算法不等于数学上的计算方法，也不等于程序。 算法设计需要考虑可行性、确定性、有穷性与足够的情报，不能只考虑计算结果。算法设计有穷性是指操作步骤有限且能在有限时间内完成，如果一个算法执行耗费的时间太长，即使最终得出了正确结果，也是没有意义的。算法在实现时需要用具体的程序设计语言描述，所以程序可以作为算法的一种描述方法。 2. 算法强调动态的执行过程，不同于静态的计算公式。 3. 算法必须能在有限个步骤之后终止 4. 算法设计必须考虑算法的复杂度 （时间复杂度，空间复杂度） 5. 用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。算法所执行的基本运算次数还与问题的规模有关；对应一个固定的规模，算法所执行的基本运算次数还可能与特定的输入有关。 6. 算法的空间复杂度是指算法在执行过程中所需要的内存空间。算法执行期间所需的存储空间包括3个部分：输入数据所占的存储空间；程序本身所占的存储空间；算法执行过程中所需要的额外空间。压缩数据存储空间会降低算法的空间复杂度 7. 对于算法的空间复杂度，如果额外空间量相对于问题规模（即输入数据所占的存储空间）来说是常数，即额外空间量不随问题规模的变化而变化，则称该算法是原地工作的。 8. 数据的存储结构会影响算法的效率 9. 数据结构中的数据元素可以是另一数据结构 10. 空数据结构可以是线性结构也可以是非线性结构。如果一个非空的数据结构满足下列两个条件：①有且只有一个根结点；②每一个结点最多有一个前件，也最多有一个后件。则称该数据结构为线性结构。如果一个数据结构不是线性结构，则称之为非线性结构 11. 双向链表每个结点有两个指针，一个为左指针，用于指向其前件结点；一个为右指针，用于指向其后件结点，再加上头指针，具有两个以上的指针，但双向链表属于线性结构。 12. 树只有一个根结点，但不论有几个叶子结点，树都是非线性结构。 13. **非性线结构“图”**就没有根结点。 14. D={ a, b, c, d, e, f } R={ (f, a), (d, b), (e, d), (c, e), (a, c) } 该数据结构为： 数据的逻辑结构有两个要素：一是数据元素的集合，通常记为D；二是D上的关系，它反映了D中各数据元素之间的前后件关系，通常记为R。即一个数据结构可以表示成B=（D,R）。其中B表示数据结构。为了反映D中各数据元素之间的前后件关系，一般用二元组来表示。例如，假设a与b是D中的两个数据，则二元组（a,b）表示a是b的前件，b是a的后件。本题中R中的根结点为f，元素顺序为f→a→c→e→d→b，满足线性结构的条件。 15. 矩阵也是线性表，只不过是比较复杂的线性表。线性表中各元素的数据类型必须相同。在线性表中，不仅可以做插入与删除运算，还可以进行查找或对线性表进行排序等操作。数组是长度固定的线性表。 16. 在线性表的顺序存储结构中，其存储空间连续，各个元素所占的字节数相同，在存储空间中是按逻辑顺序依次存放的。循环队列是队列的顺序存储结构。
栈
栈是一种后进先出的数据结构。 括号匹配问题，用到栈。 1.设栈的顺序存储空间为S(1:m)，初始状态为top=0。经过入栈和退栈运算，指针始终指向栈顶元素。初始状态为top=0，当栈满时top=m，无法继续入栈，top值不可能为m+1。 2.设栈的存储空间为S(1:50)，初始状态为top=-1。现经过一系列正常的入栈与退栈操作后，top=30，则栈中的元素个数为 ：30 解析：栈的初始状态为top=-1表示栈为空（没有规定栈中栈底必须是0），经过一系列正常的入栈与退栈操作后top=30，则空间（1:30）中插入了元素，共30个。我明白了因为存储空间必须从1到30，所以还是从零开始加。 3. 设栈的存储空间为S(1:m)，初始状态为top=m+1。经过一系列入栈与退栈操作后，top=1。现又要将一个元素进栈，栈顶指针top值变为：发生栈满的错误。 解析：栈的初始状态为top=m+1，说明栈空时top=m+1，入栈时栈顶指针是减操作（top=top-1），退栈时栈顶指针是加操作（top=top+1）。栈满时top=1，说明栈中不能再进行入栈操作（“上溢”错误）。
队列
1.队列是指允许在一端进行插入，而在另一端进行删除的线性表。由于最先进入队列的元素将最先出队，所以队列具有“先进先出”的特性，体现了“先来先服务”的原则。操作系统中的作业调度是指根据一定信息，按照一定的算法，从外存的后备队列中选取某些作业调入内存分配资源并将新创建的进程插入就绪队列的过程。是队列。
循环队列
1.循环队列是队列的一种顺序存储结构。在循环队列中，在队列满和队列为空时，队头指针与队尾指针均相同；当需要插入的数据大于循环队列的存储长度，入队运算会覆盖前面的数据，发生溢出现象。 2. 在循环队列中，队头指针和队尾指针的动态变化决定队列的长度 3. 设循环队列的存储空间为Q(1:m)，初始状态为空。现经过一系列正常的入队与退队操作后，front=m，rear=m-1，此后从该循环队列中删除一个元素，则队列中的元素个数为 从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素。如果rear-front>0，则队列中的元素个数为rear-front个；如果rear-front<0，则队列中的元素个数为rear-front+m。该题中m-1<m，即rear-front<0，则该循环队列中的元素个数为（m-1）-m+m=m-1。此后从该循环队列中删除一个元素，则队列中的元素个数为m-1-1=m-2。 （队列中元素的个数，记住要从front指向rear） 4.
顺序表 (线性表的顺序存储结构称为顺序表) （1）可以随机存取表中的任意结点（2）无需为表示结点间的逻辑关系额外增加存储空间 （1）插入和删除运算效率低（2）存储空间不便于扩充（3）不便于对存储空间的动态分配
链表 (线性表的链式存储结构称为链表) （1）在进行插入和删除运算时，只需要改变指针即可，不需要移动元素（2）存储空间易于扩充并且方便空间的动态分配 需要额外的空间（指针域）来表示数据元素之间的逻辑关系，存储密度比顺序表低
链表
1.在线性表的链式存储结构中，各数据结点的存储序号是不连续的，并且各结点在存储空间中的位置关系与逻辑关系也不一致，因此前件结点的存储序号与后件结点的存储序号之间不存在大小关系。 2. 结点中具有两个指针域的链表既可以是双向链表也可以是二叉链表，双向链表是线性结构，二叉链表属于非线性结构。循环链表是线性链表的一种形式，属于线性结构，采用链式存储结构，而循环队列是队列的一种顺序存储结构。（循环链表和循环队列都是线性结构） 3. 带链的栈就是用一个线性链表来表示的栈，线性链表不受存储空间大小的限制，因此入栈操作时不会受栈存储空间的限制而发生溢出（不需考虑栈满的问题）。 4. 由于带链栈利用的是计算机存储空间中的所有空闲存储结点，因此随栈的操作栈顶栈底指针动态变化。带链的队列中若只有一个元素，则头指针与尾指针相同。 5. 链表：数据域存放节点要存储的数据，指针域存档指向下一个节点的指针。
class ListNode: def __init__(self,x): self.val=x self.next=None
哈希表
空间换时间的方法：直接把输入的数作为数组的下标来对这个数的性质进行统计。
树
二叉树
二叉树的遍历：先序遍历：根 左 右 中序：左 根 右 后序：左 右 根 二叉查找树：又称二叉搜索树（BTS） 左子树上所有节点的数据均小于或等于根节点的数据域，右子树上的所有节点的数据均大于根节点的数据域。 平衡二叉树（AVL树）也是二叉查找树。要求左右两子树的高度差绝对值不超过1.查找时间复杂度O(logN)。 优点：提高查找运算的速度，缺点：插入和删除运算变的复杂，降低运算速度。 完全二叉树： （计算完全二叉树的节点数） 哈夫曼树（最优二叉树）：已知n个数，寻找一棵树，使得树的所有叶子结点的权值恰好为这n个数，并且使得这棵树的带权路径长度最小。
堆
堆是一棵完全二叉树。 最大堆：父节点的值大于等于子节点的值。 最小堆：父节点的值小于等于子节点的值。 堆排序：
图
G(V,E)表示图G的顶点集为V，边集合为E。 图的存储：邻接矩阵
顺序表
1.在顺序表中查找，最好情况下第一个元素就是要查找的元素，则比较次数为1；在最坏情况下，最后一个元素才是要找的元素，则比较次数为n。则平均比较次数：（1+2+┉+n）/n=(n(n+1)/2)/n=(n+1)/2。 2. 二分查找法（又称对分查找法）只适用于顺序存储的有序表。在此所说的有序表是指线性表的中元素按值非递减排列（即从小到大，但允许相邻元素值相等）。 3. 在最坏情况下的比较次数：顺序查找为n，寻找最大项和最小项均为n-1，有序表的二分查找为log2n。 4. 对长度为n的线性表排序，在最坏情况下，冒泡排序需要经过n/2遍的从前住后的扫描和n/2遍的从后住前的扫描，需要比较的次数为n(n-1)/2。本题中n=40，故比较次数为40×（40-1）÷2=780。 5. 快速排序在最坏情况下需要进行n(n-1)/2次比较，但实际的排序效率要比冒泡排序高得多。本题中n=15，15×（15-1）÷2=105。 6. 在一个排列中，如果一对数的前后位置与大小顺序相反，即前面的数大于后面的数，那么它们就称为一个逆序。快速排序的思想是：从线性表中选取一个元素，设为T，将线性表中后面小于T的元素移到前面，而前面大于T的元素移到后面，结果就将线性表分成两部分（称两个子表），T插入到其分割线的位置处，这个过程称为线性表的分割，然后再用同样的方法对分割出的子表再进行同样的分割。快速排序不是对两个相邻元素进行比较，可以实线通过一次交换而消除多个逆序，但由于均与T（基准元素）比较，也可能会产生新的逆序。 7. 希尔排序法的基本思想是：将整个无序序列分割成若干小的子序列分别进行插入排序。在子序列中每进行一次比较就有可能移去整个线性表中的多个逆序，从而改善整个排序过程的性能。 8.
数据库
1.数据库（DB）是存放数据的仓库；数据库管理系统（DBMS）是用来管理数据及数据库的系统；数据库系统（DBS）是由数据库、数据库管理系统、数据库管理员、硬件等在一起的总称。因此DBS包括DB和DBMS。 2.数据库是指长期存储在计算机内的、有组织的、可共享的数据集合。 3.数据库的数据项之间以及表之间都存在联系。 4.数据库表的一行称为一个记录，一列称一个字段。文件管理阶段不能保证相同数据重复存储。在数据库系统阶段使用数据库管理数据，可大大减少相同数据重复存储。 5.数据库管理系统是数据库系统的核心，它位于用户和操作系统之间，从软件分类的角度来说，属于系统软件。 6.数据库管理系统的功能包括数据模式定义、数据存取的物理构建、数据操纵、数据完整性安全性的定义与检查、数据库的并发控制与故障恢复、数据的服务。 7.数据库系统已经发展了三个阶段：第一代的网状、层次型数据库系统，第二代的关系型数据库系统，第三代的面向对象的数据库系统。 8.数据库系统的数据独立性，是指数据库中数据独立于应用程序且不依赖于应用程序，即数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。 数据独立性一般分为物理独立性和逻辑独立性两级。 9.数据库系统在其内部分为三级模式及两级映射，三级模式即概念模式、内模式和外模式。 概念模式是数据库系统中全局数据逻辑结构的描述，是全体用户公共数据视图。 外模式也称子模式或者用户模式，是用户的数据视图，也就是用户所能够看见和使用的局部数据的逻辑结构和特征的描述，是与某一应用有关的数据的逻辑表示。 内模式又称物理模式，是数据物理结构和存储方式的描述，是数据在数据库内部的表示方式。 10.一个数据库可以有多个外模式（因为用户可有多个），但概念模式和内模式只能有一个。 11.数据库系统通常采用三级模式结构并且提供两级映射功能，其中的外模式/模式映射保证了数据库系统具有较高的逻辑独立性，而模式/内模式映射保证了数据库系统具有较高的物理独立性。 12.数据模型是数据特征的抽象，所描述的内容有三个部分：数据结构、数据操作、数据约束。 数据结构主要描述数据的类型、内容、性质以及数据间的联系等。 数据操作主要描述在相应数据结构上的操作类型与操作方式。 数据约束主要描述数据结构内数据间的语法、语义联系，它们之间的制约与依存关系，以及数据动态变化的规则，以保证数据的正确、有效与相容。 13.数据模型按照不同的应用层次分为3种类型：概念数据模型、逻辑数据模型、物理数据模型。 概念数据模型简称概念模型，它是一种面向客观世界、面向用户的模型；它与具体的数据库管理系统无关，与具体的计算机平台无关。 逻辑数据模型又称逻辑模型，它是一种面向数据库系统的模型，该模型着重于在数据库系统一级的实现。 物理数据模型又称物理模型，它是一种面向计算机物理表示的模型，此模型给出了数据模型在计算机上物理结构的表示。 较为有名的概念数据模型有实体联系模型（E-R模型）、面向对象模型及谓词模型；逻辑数据模型有层次模型、网状模型、关系模型和面向对象模型。 14.在E-R图中实体集用矩形表示，矩形框内写实体名；属性用椭圆表示，并用无向边将其与相应的“实体”或“联系”连接起来；联系用菱形表示，在菱形框内写联系名，并用无向边将其与有关实体连接起来，在无向边旁标上联系的类型（1:1、1:n或n:n）。 15. 层次模型的基本结构是树型结构，是一对多的；网状模型类似于图的结构，是多对多的。 16. 关系数据模型的三个组成部分：关系的数据结构（用二维表表示），关系操纵（查询、删除、插入、修改），关系的数据约束（实体完整性约束、参照完整性约束、用户定义的完整性约束）。 17. 关系模式采用二维表来表示关系，简称表。 18. 关系数据库中的二维表一般满足7个性质： ①元组（行）个数是有限的——元组个数有限性。 ②元组（行）均不相同——元组的唯一性。 ③元组（行）的次序可以任意交换——元组的次序无关性。 ④元组（行）的分量是不可分割的基本特征——元组分量的原子性。 ⑤属性（列）名各不相同——属性名唯一性。 ⑥属性（列）与次序无关，可以任意交换——属性的次序无关性。 ⑦属性（列）的分量具有与该属性相同的值域——分量值域的统一性。 19. 键由一个或多个属性组成，其值能够惟一标识关系中一个元组（表中的一行）。 20. 一个属性（即一列），在某张表中不是主键（主码），但在其他表中是主键（主码），则它是第一张表的外键（外码）。 21. 在关系模式中凡能唯一标识元组的最小属性集称为该关系的键或码。关系模式中可能有若干个键，它们称为该表的候选码或候选键。关系模式中不能没有候选键。 22. 关系模型中可以有3类完整性约束：实体完整性约束、参照完整性约束和用户定义的完整性约束。 实体完整性约束是指若属性M是关系的主键，则属性M中的属性值不能为空值。 (主键不能为空) 23. 关系数据库设计有需求分析、概念设计、逻辑设计、物理设计、编码、测试、运行、进一步修改等几个阶段。 在需求分析阶段形成需求说明书，概念设计阶段形成概念数据模型（E-R模型，作为进一步设计数据库的依据），逻辑设计阶段形成逻辑数据模型（从E-R图向关系模式转换、关系视图设计、模式规范化），物理设计阶段形成数据库内部模型（此时涉及具体软件硬件环境）。 24. 关系数据库中的关系是要满足一定要求的，满足不同程度要求的为不同的范式。满足最低要求的叫第一范式，简称1NF。 在满足第一范式的基础上，进一步满足更多要求规范则是第二范式。然后在满足第二范式的基础上，还可以再满足第三范式，以此类推。 对于关系模式，若其中的每个属性都已不能再分为简单项，则它属于第一范式。
若某个关系R为第一范式，并且R中每一个非主属性完全依赖于R的某个候选键，则称其为第二范式。第二范式消除了非主属性对主键的部分依赖。
如果关系R是第二范式，并且每个非主属性都不传递依赖于R的候选键，则称R为第三范式。（传递依赖：在关系模式中，如果Y→X，X→A，且X不决定Y和A不属于X，那么Y→A是传递依赖。）
比第三范式更高级的BCF范式，它要求所有属性都不传递依赖于关系的任何候选键。