多态
参数多态:应用广泛、最纯的多态;
包含多态:同样的操作可用于一个类型及其子类型,一般需要进行 运行时的类型检查;
过载多态:操作/方法具有相同的名称,并且在不同的上下文中所代表的含义不同;
强制多态:编译程序通过语义操作把操作对象的类型强行加以转换,以符合函数或操作符的要求。
分布式数据库的各类透明
逻辑透明:也称局部映像透明。他是最低层次的透明性,该透明性提供数据到局部数据库的映像,即用户不必关心局部DBMS支持哪种数据类型、使用哪种数据操纵语言,数据模型和操纵语言的转换是由系统完成的。故,局部映像透明性对异构型和同构异质的分布式数据库系统是非常重要的。
位置透明:用户不用知道所操作的数据放在何处,即数据分配到哪个或哪些站点存储对用户来说是透明的。故,数据分片模式的改变(例如,把数据从一个站点转移到另一个站点将不会影响应用程序),因此应用程序不必改写。
分片透明:它们对数据的操作是在全局关系上进行的,用户不必关心数据是如何分片(即 如何分片对用户是透明的),因此,当分片改变时应用程序可以不变。
复制透明:用户不必关心数据库在网络的各个节点的复制情况,被复制的数据更新都由系统自动完成。
关系模式
闭包:由一个属性可以间接推出所有属性的集合;
😃a->b,b->c,那么a的闭包就是{a,b,c};
😃设有关系模式R(A,B,C,D),F是R上的FD集,F={AB→C, C→D, E→A, D→B},求属性集AB的闭包?
设AB的闭包为X={A,B}
在X的基础上,但凡是X的子集能够直接或间接推出来的属性都加入到X中去,直到没有就结束。
题中AB->C,而C->D,D->B,后面就没有了,结束
可知AB的闭包X={A,B,C,D}
候选码:能唯一地标识一个元组的属性组的值,称之为候选码,即不含有多余属性的超键。
设关系模式有N个属性,全集U中属性在F集中有以下四种情况:
只出现在F左边;——> 一定存在于某个候选码中,如果它的闭包是U,则它一定是候选码
只出现在F右边;——> 肯定不属于候选键
在F的两边均有;——> 如果它的闭包是U,那么它一定是候选码,如果闭包不是U,那么再让其与另外一个同样出现在F左右两边的属性结合,再求闭包,再判断
不出现在F中。 ——> 直接添加到候选码当中
❓设有关系模式R(A,B,C,D,E),F={A→CD,BC→E,D→B,E→A}为R上的函数依赖集,试求R上的所有候选码。
首先观察函数依赖集F,对其中的属性进行分组,
只出现在F左边:无
只出现在F右边:无
出现在F左右两边:A,B,C,D,E
不出现在F中:无
先对每个属性求闭包:
A的闭包:{A,B,C,D,E};因为闭包是U,所以属性A是候选码
B的闭包:{B};
C的闭包:{C};
D的闭包:{D,B};
E的闭包:{A,B,C,D,E};因为闭包是U,所以E是候选码
对剩下的三个属性B,C,D继续组合求闭包(A,E已经确定为候选码,继续求闭包的话得到的将是超键,而不是候选键):
对B和C组合,求BC的闭包:{A,B,C,D,E},闭包是U,所以是候选码
对B和D组合,求BD的闭包:{B,D},不是候选码;
对C和D组合,求CD的闭包:{A,B,C,D,E},闭包是U,是候选码
综上,R上所有的候选码(A)、(E)、(B,C)、(C,D)
最小依赖函数集:不含有冗余属性和冗余依赖关系,且F的依赖关系中的右边全部都是单一属性
✅求最小函数依赖集的步骤:
将F中的所有依赖右边化为单一元素;
去掉F中的所有依赖左边的冗余属性;
去掉F中所有冗余依赖关系。
数据库中的范式
😁第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。
😁第二范式(2NF):第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
😁第三范式(3NF):第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
算法求解
分治法:对于一个规模为n的问题,若该问题较容易(如规模n较小)则可以直接解决;不然就将其分解为K个规模较小的子问题,且子问题直接相互独立并与原问题形式相同,采用递归解决子问题,最后将各子问题的解合并到原问题的解;
动态规划法:在求解问题中,对每一步决策列出各种可能的局部解,再依据某种判定条件舍弃 不可能得到最优解的 局部解,每一步都经过筛选,最后以每一步的最优解来保证全局最优解;
回溯法:选优搜索法。按选优条件向前探索以达到目标,但当搜索到某一步时发现原先的选择不是优选或者达不到目标,就退回一步重新选择;
贪心法:总是能做出在当前来说是最好的选择,并不是从整体上加以考虑,它所做的每步选择只是当前步骤的局部最优选择,但对于整体来说不一定是最优选。 由于它不必为了寻求最优解而穷尽所有可能解,所以其耗费时间少,一般可以快速得到满意解,但得不到最优解。
数据结构之数组和链表
数组
数组可一般是最基本最常见的数据结构
数组一般用来存储相同类型的数据,可通过数组名和下标进行数据的访问和更新
数组中元素的存储是按照先后顺序进行的,同时在内存中也是按照这个顺序进行连续存放
数组相邻元素之间的内存地址的间隔一般就是数组数据类型的大小
链表
链表相较于数组,除了数据域,还增加了指针域用于构建链式的存储数据
链表中每一个节点都包含此节点的数据和指向下一节点地址的指针
链表自由度更高
数组与链表对比
数组 | 链表 | |
内存地址 | 连续的内存空间 | 非连续的内存空间 |
数据长度 | 长度固定,一般不可动态扩展 | 长度可动态变化 |
增删效率 | 低,需要移动被修改元素之后的所有元素 | 高,只需要修改指针指向 |
查询效率 | 高,可通过数组名和下标直接访问,时间复杂度为O(1) | 低,只能遍历节点依次查询,时间复杂度为O(n) |
数据访问方式 | 随机访问 | 顺序访问 |
今天的学习记录到此结束哦!
数组链表知识摘自知乎https://zhuanlan.zhihu.com/p/143285004?utm_source=wechat_session