<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[GavinGreenson的博客]]></title><description><![CDATA[关于C/C++, Objective-C & swift, 算法]]></description><link>https://blog.youkuaiyun.com/GavinGreenson</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; GavinGreenson]]></copyright><item><title><![CDATA[用斐波那契数列理解记忆化搜索]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/120200990</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/120200990</guid><author>GavinGreenson</author><pubDate>Thu, 09 Sep 2021 15:43:50 +0800</pubDate><description><![CDATA[记忆化搜索有点类似于dfs+dp。但是初学算法，对于记忆化搜索的机制以及什么时候应该使用记忆化搜索还比较迷茫。所以这篇博客以斐波那契数列的求法为例，用C++实现记忆化搜索，对斐波那契数列的递归求解进行优化。
1. 斐波那契数列
1.1 问题定义
输入一个正整数nnn，求斐波那契数列的第nnn项f(n)f(n)f(n)，其中f(0)=f(1)=1,f(n)=f(n−1)+f(n−2)(n≥2)f(0)=f(1)=1, f(n)=f(n-1)+f(n-2) (n \geq 2)f(0)=f(1)=1,f(n)=]]></description><category></category></item><item><title><![CDATA[L3 操作系统启动]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/111277096</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/111277096</guid><author>GavinGreenson</author><pubDate>Wed, 16 Dec 2020 16:20:43 +0800</pubDate><description><![CDATA[L3 操作系统启动
[1] setup 模块
[1.1]  setup.s
此部分的代码用来完成 OS 启动前的设置。
start: mov ax,#INITSEG	mov ds,ax	mov ah,#0x03
	xor bh,bh	int 0x10 // 取光标位置dx
	mov ah,#0x88	int0x15		mov [2],ax //cs:[2]
	cli //不允许中断
	mov ax,#0x0000	cld
do_move: mov es,ax	add ax,#0x1000
	cmp ax,#]]></description><category></category></item><item><title><![CDATA[L2 开始揭开钢琴的盖子]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/111144337</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/111144337</guid><author>GavinGreenson</author><pubDate>Sun, 13 Dec 2020 20:52:28 +0800</pubDate><description><![CDATA[L2 开始揭开钢琴的盖子
1. 计算机打开电源时执行的第一条指令
通常是IP指针（或PC指针）指向的内容，由硬件设计者决定。
以 x86 计算机为例：

x86 PC 刚开机时，CPU处于 实模式，寻址方式为 CS:IP
开机时，CS = 0xFFFF，IP = 0x0000
从 ROM BIOS 映射区 寻址，地址为 0xFFFF0
检查 RAM、键盘、显示器、磁盘、……
将磁盘的 0 磁道 0 扇区（即操作系统的引导扇区）的 512 字节的内容 读入内存 0x7c00 处
设置 CS = 0x07c0，]]></description><category></category></item><item><title><![CDATA[70道面试常见算法题]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106200116</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106200116</guid><author>GavinGreenson</author><pubDate>Mon, 18 May 2020 19:58:41 +0800</pubDate><description><![CDATA[字符串的循环移位
三次翻转


字符串的包含
哈希表


字符串全排列
next_permutation算法


字符串的所有组合
dfs


字符串转整数
stoi(), stol(), 注意边界


回文判断：判断字符串是否为回文串
双指针从两头往中间扫描


判断链表是否回文
（1）快慢指针找中点（2）翻转后半部分（3）遍历比较两段链表


判断栈是否回文
出栈后再入栈，与原字符串比较是否完全相同


最长回文子串
manacher算法：（1）预处理（2）id记录最远回文串中心，mx记录最远回文串..]]></description><category></category></item><item><title><![CDATA[概率论]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106189062</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106189062</guid><author>GavinGreenson</author><pubDate>Mon, 18 May 2020 11:12:34 +0800</pubDate><description><![CDATA[对立、互斥、独立


分布函数的性质：
（1）F(-INF)=0，F(INF)=1
（2）F(x)单调递增
（3）右连续
（4）P{x1 &lt; X &lt;= x2} = F(x2) - F(x1)


概率密度的充要条件：
（1）f(x) &gt;= 0
（2）∫(-INF, INF)f(t)dt = 1
概率密度的性质：
F`(x) = f(x)


常用期望和方差
（1）0-1分布：E(x)=p, D(x)=p(1-p)
（2）二项分布：E(x)=np, D(x)=np(1-p)
（3）泊松分..]]></description><category></category></item><item><title><![CDATA[离散数学]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106181747</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106181747</guid><author>GavinGreenson</author><pubDate>Sun, 17 May 2020 21:52:42 +0800</pubDate><description><![CDATA[析取范式：简单合取式析取
合取范式：简单析取式合取
主析取范式：极小项mi成真赋值
主合区范式：极大项Mj成假赋值


关系的性质：自反，对称，传递
闭包：自反闭包，对称闭包，传递闭包


等价关系：自反，对称，传递
偏序关系：自反，反对称，传递


等势：存在A→B的双射函数
优势：存在A→B的单射函数
基数：
有穷集合：cardA=|A|；
自然数集合：阿列夫0；
实数集合：阿列夫


握手定理：无向图中，顶点度数之和 = 边数的2倍


图的同构：对于图G1=&lt;V1, E1&gt;，图G2=..]]></description><category></category></item><item><title><![CDATA[计算机组成原理]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106162178</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106162178</guid><author>GavinGreenson</author><pubDate>Sat, 16 May 2020 17:24:27 +0800</pubDate><description><![CDATA[计算机结构
（1）输入（2）输出（3）存储器（4）运算器（5）控制器


CPI：执行一条指令所需的时钟周期数


MAR：地址寄存器
MDR：数据寄存器


机器字长：能直接处理的二进制数据长度
指令字长：一个指令的二进制代码长度
存储字长：一个存储单元的二进制长度


存储器
按作用分类：主存（内存），辅存（外存），Cache
按存取方式分类：RAM（SRAM，DRAM），ROM，串行访问存储器


Cache
和主存的映射方式：直接映射，全相联映射，组相联映射
替换算法：随机算法，FIFO，LRU..]]></description><category></category></item><item><title><![CDATA[机器学习]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106160659</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106160659</guid><author>GavinGreenson</author><pubDate>Sat, 16 May 2020 16:07:14 +0800</pubDate><description><![CDATA[机器学习
（1）任务T（2）经验E（3）性能度量P


监督学习和无监督学习
监督学习：给的数据集包括正确答案（1.回归问题；2.分类问题）
无监督学习：数据集无正确答案（1.聚类算法；2.鸡尾酒会问题）


线性回归


代价函数：J(θ) = 1/2mΣ(i=1, m)(h(xi) - yi)^(2)


梯度下降：
重复直到收敛 {
θj := θj - α×(J(θ)对θj的偏导)（同时更新，α：学习率）
}


特征缩放：约束至[-1, 1]左右，加快梯度下降的收敛速度
均值归一：用xi - ..]]></description><category></category></item><item><title><![CDATA[线性代数]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106157346</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106157346</guid><author>GavinGreenson</author><pubDate>Sat, 16 May 2020 12:18:32 +0800</pubDate><description><![CDATA[n阶行列式可根据任意一行（列）的代数余子式展开


拉普拉斯展开式
| A * |  | A O |
| O B | = | * B | = |A| * |B|


范德蒙行列式
=


伴随矩阵 A* ：由代数余子式构成的矩阵
|A| = 特征值乘积
AA* = A*A = |A|E


初等矩阵：单位矩阵经过一次初等变换得到的矩阵


矩阵可逆的条件:
（1）存在B，AB = E 或 BA=E
（2）Ax = 0只有零解
（3）|A|!=0或r(A)=n或A的行列向量线性无关
（4）存在b，Ax=b..]]></description><category></category></item><item><title><![CDATA[EffectiveCPP]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106148429</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106148429</guid><author>GavinGreenson</author><pubDate>Fri, 15 May 2020 19:36:29 +0800</pubDate><description><![CDATA[视C++为一个语言联邦
C、面向对象、泛型和模板、STL


尽量以const, enum, inline替换 #define
宏定义不够安全


尽可能使用 const
const * int p; // 被指向物是常量



const int p; // 指针本身是常量



确定对象被使用前已先被初始化
初始化列表，初始化次序


了解C++默默编写并调用哪些函数
默认构造函数、拷贝构造函数、赋值运算符、析构函数


若不想使用编译器自动生成的函数，就应该明确拒绝
使用private封装不想被调..]]></description><category></category></item><item><title><![CDATA[微积分]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106143024</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106143024</guid><author>GavinGreenson</author><pubDate>Fri, 15 May 2020 15:25:44 +0800</pubDate><description><![CDATA[间断点
I类间断点：可去间断点，跳跃间断点
II类间断点：无穷间断点，振荡间断点


可导一定连续，连续不一定可导


微分形式不变


洛必达法则的条件：



0/0型或∞/∞型
f(x)和g(x)在去心邻域可导且g’(x)!=0
lim(x→x0)f’(x)/g’(x) = A或∞



拉格朗日中值公式
f(b) - f(a) = f’(ξ)(b - a)


凹凸函数的分界点为拐点


f(x)在[a,b]连续→定积分一定存在
f(x)在[a,b]有界，且间断点有限→定积分存在
原函数存在与定..]]></description><category></category></item><item><title><![CDATA[计算机网络]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106141853</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106141853</guid><author>GavinGreenson</author><pubDate>Fri, 15 May 2020 14:45:05 +0800</pubDate><description><![CDATA[OSI分层和TCPIP分层
OSI分层
应用层
表示层
会话层
传输层 - 报文段或用户数据报
网络层 - 数据报
链路层 - 帧
物理层 - 比特

TCP/IP分层
应用层
传输层
网际层
网络接口层

物理层方式


电路交换
报文交换
分组交换（数据报、虚电路）


物理层设备


中继器
集线器


数据链路层（组帧，差错控制，流量控制，可靠传输，介质访问控制）
滑动窗口：


停止-等待协议
后退N帧协议
选择重传协议


介质访问控制（MAC）：争用信道，对应MAC地址，即物理地址（6B）
.]]></description><category></category></item><item><title><![CDATA[操作系统]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/106139491</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/106139491</guid><author>GavinGreenson</author><pubDate>Fri, 15 May 2020 12:35:14 +0800</pubDate><description><![CDATA[并行与并发
并发：同一时间间隔，分时
并行：同一时刻


操作系统特征：并发，共享，虚拟，异步


内核功能：时钟管理，中断机制，原语，系统控制的数据结构


中断、异常和系统调用
中断：外中断，CPU指令以外的事件（IO结束，时间片到，人为请问）
异常：内中断，CPU执行指令内部的事件
系统调用：用户程序调用系统提供的子功能（设备管理，文件管理，进程控制，进程通信，内存管理）
系统调用过程：
用户进程 → 陷入指令 → 核心态，系统堆栈 → 内核执行特权指令 → 从系统调用返回


为什么引入进程？
..]]></description><category></category></item><item><title><![CDATA[J-HDU 2594 (KMP & 扩展KMP)]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/105692102</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/105692102</guid><author>GavinGreenson</author><pubDate>Wed, 22 Apr 2020 21:56:11 +0800</pubDate><description><![CDATA[HDU 2594 Simpsons’ Hidden Talents
为了搞定这题，先要学习扩展KMP算法。当然这题用普通KMP求next数组也可以做，两种方法的AC代码都会放在最后。
扩展KMP
扩展 KMP 解决的是这样的问题：
给定母串 S 和子串 T，要求母串每个后缀与子串的最长公共前缀。
例如，设母串 S = “marjoriz”，T = “riemann”，取母串长度为 3 的后缀 “r...]]></description><category></category></item><item><title><![CDATA[E-POJ 1860]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/105589073</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/105589073</guid><author>GavinGreenson</author><pubDate>Fri, 17 Apr 2020 21:34:48 +0800</pubDate><description><![CDATA[#include &lt;iostream&gt;
#include &lt;queue&gt;
#include &lt;cstring&gt;
using namespace::std;
typedef struct Change {
    Change(void) {}
    Change(int i1, int i2, double f1, double f2) : From(i1),...]]></description><category></category></item><item><title><![CDATA[D-POJ 3268]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/105589062</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/105589062</guid><author>GavinGreenson</author><pubDate>Fri, 17 Apr 2020 21:34:17 +0800</pubDate><description><![CDATA[#include &lt;iostream&gt;
#include &lt;cstring&gt;
using namespace::std;
#define INF 0x3f3f3f3f
const int maxn = 1002;

// 有向图的单源点最短路径，先求从该节点出发的，再求以该节点为终点的
int N, M, X; // 1 &lt;= N &lt;= 1000, 1 &lt;...]]></description><category></category></item><item><title><![CDATA[C-POJ 1797]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/105589036</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/105589036</guid><author>GavinGreenson</author><pubDate>Fri, 17 Apr 2020 21:33:44 +0800</pubDate><description><![CDATA[方法一 朴素dijkstra
#include &lt;iostream&gt;
#include &lt;cstring&gt;
#define INF 0x3f3f3f3f
using namespace::std;

// 普通dijkstra，O(n^3)，会超时
int T;
int n, m; // 1 &lt;= n &lt;= 1000, n个点, m条边
int dist[100...]]></description><category></category></item><item><title><![CDATA[B-POJ 2253]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/105589021</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/105589021</guid><author>GavinGreenson</author><pubDate>Fri, 17 Apr 2020 21:32:31 +0800</pubDate><description><![CDATA[#include &lt;iostream&gt;
#include &lt;cstring&gt;
#include &lt;vector&gt;
#include &lt;cmath&gt;
#define INF 0x3f3f3f3f
using namespace::std;
typedef pair&lt;int, int&gt; pii;

// 时间复杂度O(n*n*n)，dijks...]]></description><category></category></item><item><title><![CDATA[A-POJ 2378]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/105588999</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/105588999</guid><author>GavinGreenson</author><pubDate>Fri, 17 Apr 2020 21:31:51 +0800</pubDate><description><![CDATA[比较慢的dijkstra
#include &lt;iostream&gt;
#include &lt;cstring&gt;
#include &lt;vector&gt;
#define INF 0x7f7f7f7f
using namespace::std;

// O(n*n)的dijkstra算法
int N, T; // 2 &lt;= N &lt;= 1000, 1 &lt;= T ...]]></description><category></category></item><item><title><![CDATA[N-HDU 2612]]></title><link>https://blog.youkuaiyun.com/GavinGreenson/article/details/105532869</link><guid>https://blog.youkuaiyun.com/GavinGreenson/article/details/105532869</guid><author>GavinGreenson</author><pubDate>Wed, 15 Apr 2020 13:18:42 +0800</pubDate><description><![CDATA[#include &lt;iostream&gt;
#include &lt;cstring&gt;
#include &lt;queue&gt;
#include &lt;algorithm&gt;
using namespace::std;
typedef pair&lt;int, int&gt; pii;
typedef pair&lt;pii, int&gt; piii;
typedef ...]]></description><category></category></item></channel></rss>