目录
计算机组成原理:
第一章:
计算机的分类: 模拟计算机 和 数字计算机 .
模拟计算机: 由模拟运算器件构成 , 处理在时间和数值上连续的模拟量.
数字计算机: 由数字逻辑器件构成 , 处理离散的数字量.
专用计算机: 针对特定任务设计的计算机.
通用计算机: 适应性高 , 但是牺牲了效率 , 速度 和 经济性.
按系统规模 和 计算能力划分:
巨型机 (超算)
大型机 , 小型机 , 微型机 规模 和 计算能力依次递减.
冯 诺依曼体系 (奠定了现代电子计算机的理论基础.
1. 用二进制代码表示程序和数据.
2. 采用存储程序的工作方式.
3. 新型的现代计算机硬件组成: 存储器 , 运算器 , 控制器 , 输入设备 , 输出设备.
计算机系统的组织:
硬件: 是指构成计算机系统的 实体 和 装置之类的有形设备 , 是组成计算机系统的物质基础.
软件: 是指由硬件所表达的各种内在信息 , 包括 数据 与 控制程序. 因为它们是无形的东西 , 所以称为软件 或 软设备.
主要功能部件:
1. CPU : (1) 运算器: 完成 算数 和 逻辑 运算 , 主要由 ALU 构成. (2) 控制器: 产生控制命令 , 控制全机操作.
2.存储器 : 存储数据 和 数字化后的程序. ( 存储单元: 在存储器中保存一个n位二进制数的n个存储电路 , 组成一个存储单元. 地址: 存储器由许多存储单元组成 , 每个存储单元的编号 , 称为地址. 内存储器: 即 内存. 是一种用来存放直接为CPU提供服务的 程序 和 数据存储器.
3. 输入/输出设备 : 执行输入/输出信息的转换.
4.总线 : 能为多个部件分时共享的一组信息传送通入.
计算机系统的性能指标:
1.基本字长: 指一次数据操作的基本位数. ( 它会影响计算的精度 , 指令的功能.
2.外频: 外部频率 或 基频 , 也叫系统时钟频率.
3.常用的CPU性能指标: (1)CPU的主频 = 外频 x 倍频系数. (2)IPS: 每秒执行指令数. (3)CPI: 每个指令执行的周期值. (4)FLOPS: 每秒执行浮点运算的次数. (5)CPU的功耗: 动态功耗->P = C x U^2 x f ; 静态功耗->泄露.
4.数据传输: 带管 = 位宽 x 工作频率 / 8 (B/S) (物理含义: 单位时间内数据的传输量.
步骤: a.计算平均CPI. b. 计算始终周期->指令数 x 平均CPI. c.计算次数->主频 / 时钟周期数. d.带宽 -> 次数 x 可并行输出的大小数据.
5.存储器的容量:
a.内存(主存)容量: 指可编码的存储单元个数 x 存储单元位宽.
b.外存(辅存)容量: 鬼知道.
数据库:
数据的定义:
模式定义: 略.
基本表的 定义 , 删除 , 修改.
定义: create table <表名> (<col> <数据类型> [完整性约束])
eg: sno char(9) primary key -- 列级完整性约束条件
foreign key (外col) references 被参照表(col)
修改基本表:
alter table 表名
add --添加新列 , 新的列级完整性约束条件 和 新的表级完整性约束条件
drop column --删除表中的列 , 如果指定了 cascade 短语 , 则自动删除引用了该列的其他对象
alter column --修改原有的列定义 (包括列名 , 数据类型.
删除基本表: drop table <表名>
leetcode每日一题:
连续三天的简单题了.
正常的思路 , 以及题目都是给你个头结点 , 让你删除某个符合条件的值.(一步步遍历寻找就行 .
但是这道题反其道行之 , 他不给你头结点 , 而给你要删除的结点 , 然后要你删除. 开始就很迷惑 , 但是实际上思考一下就会明白这题 又是标准 "leetcode" 题 . 因为我们没有头结点 , 所以我们实际上是不可以删除当前结点 . 因为链表只能往后遍历 , 无法得到前一个结点的地址 . 那么我们只能删除这个结点的后面的一个结点.
那么我们是不是可以 把下一个结点的值给要删除的结点 , 然后删除下一个结点. 这是不是和要的结果一样.
用leetcode上的评论就是: 如何让自己在世界上消失,但又不死? —— 将自己完全变成另一个人,再杀了那个人就行了。
class Solution {
public:
void deleteNode(ListNode* node) {
node -> val = node -> next -> val;
node -> next = node -> next -> next;
}
};
能力提升:
题意: 把每个 长度为 k 的区间 的最大值输出.
解题: 暴力谁不会啊! 可是数据很大 , 暴力一定会超时的.
因为是要求得区间最大值 , 所以 标准线段树 是可以的 , 但是有没有更简单的方法呢 , 或者是更好理解的方法呢?
通过以往做题的经验积累 , 不断求取最大值的方法还有 利用优先队列 .那么我们是不是可以用优先队列来解题呢? 可是我们不仅要对数字的大小排序 , 还需要按照数组顺序来删除优先队列里面的数字. 这可怎么办?
表面上 , 我们无法通过优先队列来解题. 但是我们引入一种新的思想 : 在区间 [i , i + k] 中 , max值在第 ide 位 , 在我们不断 i ++ 的过程中 , 如果 max值不变 (设加了m次) , 那么max值 在 [i , i + k] 和 [i + m , i + k + m] 中是一样的 (即i 到 i + m 位 对实际结果不产生影响), 而当 ide 位被舍弃时 , i 到 ide 位都可以一次性舍去 , 优先队列又自动对后面的 [i + ide , i + ide + k] 位排序 ,寻找下一个 max 值. 如此反复就可以求到全部的结果 . (详细可对照代码理解.
class Solution {
private:
vector<int>re;
priority_queue<pair<int , int>>p_que;
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
for(int i = 0;i < k;i ++) p_que.push({nums[i] , i});
re.push_back(p_que.top().first);
for(int i = k;i < nums.size();i ++){
while(!p_que.empty() && p_que.top().second < i - k + 1) p_que.pop();
p_que.push({nums[i] , i});
re.push_back(p_que.top().first);
}
return re;
}
};
Day Eleven -- 海棠花未眠.