也是用不太到了,就是对本科学习做个简简单单的复习吧.
其四大特性ACID:
①原子性A
要么都执行,要么都不执行.
②一致性C
在一个事务执行之前和执行之后数据库都必须处于一致性状态.
③分离性I
并发的事务是相互隔离的,即一个事务的操作及正在操作的数据必须封锁起来,不被其他企图进行修改的事务看到.
④持久性D
意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失.
范式
①第一范式:
确保每一列的原子性
②第二范式:
非键字段必须依赖于键字段
③第三范式:
在第二范式的基础上,不存在传递依赖
视图
一种虚拟的表,具有和物理表相同的功能,对视图的修改不会影响基本表.
优点:
简化操作,把经常使用的数据定义为视图;
安全性,视图随着基表的变化而更新,但不会通过视图修改基本表的数据;
可以合并分离的数据,创建分区视图,更好的实现数据的对比.
缺点:
性能,SqlServer必须把视图的查询转化成对基本表的查询,如果视图是由一个复杂的多表查询所定义,那么即使是一个简单查询SQLServer也会把它变成一个复杂的结合体.
修改限制,当用户修改视图的某行时,SqlServer必须把它转换成基本表某行的修改,对于复杂视图来说可能是不能修改的.
总之,视图的特性导致的安全性这一优点,同样也造成了复杂视图的操作困难,影响性能.
游标
是对查询出来的结果集作为一个单元来有效的处理,可以定在特定行,所以逐条处理数据时好用.
锁机制
事务获得锁后,即取得了对数据的控制权,在事务释放它的锁之前,其他事务不能更新此数据.
作用:为了保证数据库事务的一致性,
防止出现脏读、不可重复读、幻读等并发事件,导致可能会发生死锁.
drop | truncate | delete
直接删除表 | 删除表中数据,再插入时自增长又从1开始 | 删除表中数据,可以加where字句
1、客户端向服务端发送序号请求建立连接
2、服务端收到序号包,发送确认号,同时也发送一个序号
3、客户端对请求的序号包作出确认回应
TCP连接是全双工的,两端都可以先挥手
其中一端完成数据发送任务后,发送一个FIN包来终止,另一端针对这个FIN包回复确认包,
直到另一端也发送请求终止数据包FIN,另一端作出确认应答,并且还要发送一个ACK=1表示确认号有效,如果没有收到这个就可以进行重传.
TCP | UDP |
---|---|
面向连接 | 无连接 |
可靠 | 尽最大努力 |
实时性,工作效率高 | |
点到点 | 一对一;一对多;多对一;多对多的交互通信 |
对系统资源要求多 | 少 |
流量控制是端到端的控制,原理是通过滑动窗口的大小改变来实现.
OS特点
①共享 资源可以被多个并发执行的进程使用
②并发 可以在同一时间间隔处理多个进程,需要硬件支持
③虚拟 将物理实体映射成为多个虚拟设备
④异步 进程执行走走停停,每次进程执行速度可能不同,但OS需保证进程每次执行结果相同
操作系统的主要功能
处理机管理
进程控制、进程同步、进程通信、调度
存储器管理
内存分配、内存包含、地址映射、内存扩充
设备管理
缓冲管理、设备分配、设备处理
文件管理
文件存储空间管理、目录管理、文件读/写保护
发展过程
无操作系统(人工操作方式):用户独占、CPU等待人工
单道批处理:内存只保存一道作业
多道批处理:运行多个程序同时存在主存中
分时:及时接收、及时处理,交互性
实时:实时控制、实时信息处理
进程和线程
进程是资源分配的最小单位,线程是程序执行的最小单位;
进程有独立的内存空间,不同进程之间不能直接共享其他进程资源,同一进程内的线程是共享进程内存空间;
线程被称为轻量级进程,在进程中包含线程,线程切换对系统开销更小一些,能够提高并发执行的程度,资源利用率和系统吞吐量.
进程三组成:程序段、数据段、PCB
进程切换:
保持处理机上下文->更新PCB->把PCB移入相应队列(就绪、阻塞)->选择另一个进程并更新其PCB->更新内存管理的数据结构->恢复处理机上下文
P申请资源 | V释放资源
进程的五种状态
①创建
②就绪
③阻塞
④执行
⑤终止
管程
由一组数据及这组数据操作的定义组成的软件模块
进程同步互斥工具
封装了同步操作,对进程隐藏了同步细节,简化同步功能的调用
线程间的同步与通信类型
饥饿进程可以只有一个,可能处于就绪状态,但是死锁一定是处于阻塞状态(它申请的资源不会被释放=在机场等一艘船)
页面置换算法
OPT最佳置换算法
先进先出FIFO
最近最久未使用LRU
时钟算法
改进型时钟
批处理作业调度算法
先来先服务FCFS
最短作业优先SJF
最高响应比优先HRN
进程调度算法
先进先出
时间片轮转
最高优先级
多级队列反馈
磁盘调度算法
先来先服务
最短寻道时间优先
扫描算法
循环-扫描
FAT
分配给文件的所有盘块号都放在FAT中,记录了文件的物理位置
中断 | 异常 | 系统调用
中断为了支持CPU和设备之间的并行操作,CPU指令以外的事件发生(强迫中断)
异常表示CPU执行指令本身出现的问题,不能被屏蔽
系统调用是由应用程序请求操作系统提供服务产生,有意的、主动的,要从用户态通过中断进入内核态,应用程序在用户态执行时请求系统调用.
存储器的层次结构
外存
内存
快速缓存
寄存器
存储管理方案
分区存储
分页存储
分段存储
段页式存储
虚拟存储
冯诺伊曼结构
输入输出,计算单元,控制单元,存储单元
高速缓存的作用
连接CPU和内存
cache和寄存器区别
cache用来做高速的CPU和低速的主存之间的加速带;
寄存器是暂时存储的CPU组成部分.
指令系统
CISC复杂指令集
RISC精简指令集
流水线
将重复性的过程分成若干个子过程来完成
总线和I/O
总线是指数据通信的连接线,有地址、数据、控制指令
I/O方式有程序性、中断性、通道、DMA
从前序与中序遍历序列构造二叉树:
class Solution {
private:
unordered_map<int, int> index;
public:
TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
if (preorder_left > preorder_right) {
return nullptr;
}
// 前序遍历中的第一个节点就是根节点
int preorder_root = preorder_left;
// 在中序遍历中定位根节点
int inorder_root = index[preorder[preorder_root]];
// 先把根节点建立出来
TreeNode* root = new TreeNode(preorder[preorder_root]);
// 得到左子树中的节点数目
int size_left_subtree = inorder_root - inorder_left;
// 递归地构造左子树,并连接到根节点
// 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素
root->left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);
// 递归地构造右子树,并连接到根节点
// 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素
root->right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
// 构造哈希映射,帮助我们快速定位根节点
for (int i = 0; i < n; ++i) {
index[inorder[i]] = i;
}
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
}
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solution/cong-qian-xu-yu-zhong-xu-bian-li-xu-lie-gou-zao-9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
红黑树详解
自平衡二叉查找树
O(log n)
数据结构——图解AVL树(平衡二叉树)
快速排序算法-图文详解
C语言——冒泡排序
最短路径问题—Dijkstra 算法最详解
将引用作为函数返回值的好处
在内存中不会产生被返回值的副本
三种传参方式
#define在预处理阶段起作用
只是简单的字符串替换,没有类型检查
有多少地方使用就替换多少次,它定义的宏常量在内存由若干个备份
static
修饰的变量在整个文件中都是可见的
面向对象的三个要素(基本特征)
封装
将客观事物封装成类,隐藏实现细节,模块化代码
多态
实现方式-覆盖和重载
覆盖:子类重新定义父类的虚函数
继承
子类继承父类功能,对父类功能进行扩展
对结构中成员的赋值是互不影响的.
c++是不是类型安全的语言?
不是,因为不同类型间指针可以强制转换
基类的析构函数为什么是虚函数
为了防止派生类析构函数未执行,造成资源泄露
#include尖括号和双引号区别
<>是标准头文件,“”是非系统头文件
为什么有了指针,还要使用引用?
为了支持运算符的重载,更加方便
如何避免野指针
声明指针记得初始化,暂时不用就指向NULL;
使用malloc分配内存,必须经过显示释放(free),避免内存泄露.
软件工程标准步骤
问题定义
可行性研究
需求分析
总体设计
详细设计
编码和单元测试
综合测试
软件维护
软件测试分类
自顶向下 | 自底向上测试方法
从程序入口
从最底层模块
软件工程三要素
方法, 工具, 过程
死代码
永远不会被执行到的代码
内聚 | 耦合
内聚:一个好的内聚模块内应当尽量只做一件事,描述的模块内的联系
耦合:各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度
也不用多看,对导师方向有些了解就行了
什么是数据挖掘
通过算法从大量数据中搜索隐藏其中的信息,
通过分析每个数据,从大量数据中寻找其中规律,主要有数据准备、规律寻找和规律表示三个步骤.
什么是人工智能
研究开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统.
构造具有智能的人工系统,研究如何应用计算机的软硬件来模拟人类某些智能行为的基本理论方法技术.
什么是机器学习
对计算机一部分数据进行学习,然后对另一些数据进行预测与判断,
核心是使用算法解析数据,从中学习,然后对新数据做出决定或预测,就像人获取一定的经验,可以对新问题进行预测.
什么是深度学习
深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字、图像、声音等数据的解释有很大的帮助.使机器模仿视听和思考等人类活动,通过多层处理,逐渐将初始的“底层”特征表示转化为“高层”特征表示后,用“简单模型”即可完成复杂的分类等学习任务.
什么是计算机视觉
用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像.