03 2022 档案

摘要:做个简单的比喻:进程=火车,线程=车厢,协程=车厢乘客 线程在进程下行进(单纯的车厢无法运行) 一个进程可以包含多个线程(一辆火车可以有多个车厢) 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘) 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易) 进程要比线程消 阅读全文
posted @ 2022-03-31 16:42 阿豆23 阅读(86) 评论(0) 推荐(0) 编辑
摘要:程序在多处理器上运行会因为,多个线程同时进行,而导致丧失语句的原子性。 例如读和写的操作是分开的,不能保证同时完成。 所以软件不够用硬件来凑,通过硬件实现一条指令完成读写:这就是自旋锁。 可以理解为一个房间门口桌上只放一把钥匙,每次有人想进就用其他东西交换钥匙, 拿到钥匙才能进入房间,拿不到钥匙的就 阅读全文
posted @ 2022-03-29 16:16 阿豆23 阅读(328) 评论(0) 推荐(0) 编辑
摘要:当需要进行查找速度优化时,就可以使用哈希表,需要使用额外的空间存储数据,随后可以提高查找效率。 常用的哈希表数据结构有三种:数组、集合(set)、映射(map)。 当数据量小时数组也可以有哈希功能: 例如统计字符串中字母出现次数,可以使用 s[0]~s[25] 的数组分别存储字母数量。 单当数据量无 阅读全文
posted @ 2022-03-28 09:58 阿豆23 阅读(60) 评论(0) 推荐(0) 编辑
摘要:根据5层原理模型,模拟用户访问网站的流程: 定义一个传输的帧X。 用户端: 首先应用层根据协议创建HTTP报文:X=HTTP 随后在运输层加入TCP报文段:X=HTTP+TCP 然后在网络层加入IP首部:X=HTTP+TCP+IP 到达数据链路层加入首部:X=ETH+HTTP+TCP+TP+ETH 阅读全文
posted @ 2022-03-26 17:00 阿豆23 阅读(72) 评论(0) 推荐(0) 编辑
摘要:可以理解一个线程就像一条单链表,依次执行每一步的操作。 当有多个线程时就像是增加了新的单链表。 在单处理器时代,同时只选取一个进程执行,所有可以很容易保证原子性。 此处引入原子性:即处理器和内存同一时间内被一个线程完全占有 但到了多处理器时代,就会出现多个线程同时进行,并且使用同一片内存。 这样自然 阅读全文
posted @ 2022-03-26 16:48 阿豆23 阅读(82) 评论(0) 推荐(0) 编辑
摘要:法律上定义为7层,但实际应用的是4层模型。 分层是为了把整个大问题,分解为不同方面的小问题解决。 总结如下: 应用层:解决进程间交互完成网络应用的问题(HTTP/FTP/DNS) 传输层:解决进程之间基于网络的通信,传输错误等问题。(TCP/UDP) 网络层:解决网络中各子网络与主机的标识问题,网络 阅读全文
posted @ 2022-03-24 16:55 阿豆23 阅读(40) 评论(0) 推荐(0) 编辑
摘要:程序本质上是状态机,可以理解为:计算+syscall 由此可知,任何程序的运行,都可以通过系统状态理解。 阅读全文
posted @ 2022-03-24 16:35 阿豆23 阅读(30) 评论(0) 推荐(0) 编辑
摘要:滑动窗口本质上是一个双指针。 如求解和大于目标值的最短子序列一题。 首先设置左指针 left 和右指针 right 都从零开始,随后 right 开始移动并累加和,当和大于目标值时停止。 随后左指针开始移动,并不断更新最短子序列长度,并从累计和中减去 left 位置的值。 由此遍历完整个数组。 wh 阅读全文
posted @ 2022-03-24 14:44 阿豆23 阅读(25) 评论(0) 推荐(0) 编辑
摘要:二分法有两种边界范围: 一是左闭右闭 [left, right] : 此时可以取到最右值,所以初始右边界设为:right=len(数组长度)-1,同时,边界变换时,right=mid(中值)-1; 二时左闭右开 [left, right) : 此时取不到最右值,所以初始右边界设为:right=len 阅读全文
posted @ 2022-03-24 10:12 阿豆23 阅读(88) 评论(0) 推荐(0) 编辑
摘要:题目本身没有难度,使用栈即可。 但是有个小技巧,将左右括号对应存入哈希表中,查找时可以大大简化代码。 unordered_map<char, char> pairs = { {')', '('}, {']', '['}, {'}', '{'} }; 判断时即可使用如下代码: stk.top() == 阅读全文
posted @ 2022-03-23 10:49 阿豆23 阅读(30) 评论(0) 推荐(0) 编辑
摘要:n<<m 等同于 n*2m 阅读全文
posted @ 2022-03-23 09:04 阿豆23 阅读(26) 评论(0) 推荐(0) 编辑
摘要:n&(n-1) 可以消除掉n最右边的1. 用途如,检查二进制数中1的个数 阅读全文
posted @ 2022-03-23 08:37 阿豆23 阅读(63) 评论(0) 推荐(0) 编辑
摘要:题目链接: https://leetcode-cn.com/problems/house-robber/ 按照基本逻辑走: 1,确定状态 首先分析题目,找核心逻辑。本题中规定不能获得相邻位置的数据,同时可以容易想到,越到后面,累加值越大。 由此我们遇到一个问题,最后取第n个数据,还是取第n-1个数据 阅读全文
posted @ 2022-03-22 10:20 阿豆23 阅读(36) 评论(0) 推荐(0) 编辑
摘要:1,确定状态(关键要把n和n-1联系起来) 2,找到转移公式 3,确定初始条件以及边界条件 4,计算结果。 阅读全文
posted @ 2022-03-21 17:00 阿豆23 阅读(20) 评论(0) 推荐(0) 编辑
摘要:题目链接: https://leetcode-cn.com/problems/merge-sorted-array/ 常规方法都比较容易想到,此题最妙的一个方法是从后面插入。 这样可以在原数组上操作,同时操作过程中不会产生数据覆盖冲突。 阅读全文
posted @ 2022-03-21 10:30 阿豆23 阅读(50) 评论(0) 推荐(0) 编辑
摘要:在取中值时: int mid = left + ((right - left) / 2); 优于: int mid = (left + right) / 2; 原因为:当左值与右值的和大于容量时,操作就越界了。 阅读全文
posted @ 2022-03-21 09:49 阿豆23 阅读(66) 评论(0) 推荐(0) 编辑
摘要:vector<vector<int>> vec; vec.push_back(vector<int>()); vec.back().push_back(); 第一行创建。 第二行插入空白vector,等于换行。 第三行在末尾的vector容器中插入数据。 阅读全文
posted @ 2022-03-20 11:02 阿豆23 阅读(54) 评论(0) 推荐(0) 编辑
摘要:1.验证回文链表时,容易想到两种方式:一是使用栈,二像字符串一样使用双指针,而问题在于单链表的查找不同于数组。 2.更巧妙的方式为,先找到链表中点,随后反转后半部分,再使用双指针同时步进比较。 3.找到中间节点,可以使用快慢指针,双指针同时出发,其中一指针每次步进为2,当其到达尾端时,另一指针正好到 阅读全文
posted @ 2022-03-19 14:28 阿豆23 阅读(20) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示