
    ik                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m	Z	m
Z
 dZdZdZdddd	d
ddd	dddd	dddd	dddd	gZdddd	dddd	dddd	dd d!d	gZd"d#d$d	d%d&d'd	d(d)d*d	d+d,d-d	gZd.d/d0d	d1d2d3d	d4d5d6d	d7d8d9d	d:d;d<d	gZeeeed=Zi dd>d
d?dd@ddAddBddCddDddEddFd"dGd%dHd(dId+dJd.dKd1dLd4dMd7dNd:dOiZdP ZdQ ZdR ZdS ZdT ZdU ZdV ZdW ZdX ZdY ZdZ Zed[k(  r e        yy)\    N)datetime	timedeltaz/home/ubuntu/tasksz/tmp/study_cron.logz9tvly-dev-QmYsc-vdcwMznDDx5WofdNfxvChOhDmSICdtxc2Be9xG59jcds_01u'   时间复杂度与空间复杂度分析u  ### 时间复杂度与空间复杂度分析

**核心概念**
- 时间复杂度：算法执行次数与问题规模的渐近关系
- 空间复杂度：算法所需存储空间与问题规模的渐近关系
- 常用记号：O(1)、O(log n)、O(n)、O(n log n)、O(n2)、O(n3)、O(2n)、O(n!)

**易错点**
1. 混淆O(n)和O(2n)：系数不重要，渐近上界只看最高次项
2. 递归算法空间复杂度：递归深度×每次递归的局部变量大小
3. 最好/最坏/平均复杂度：不要把三者混淆

**典型题目**
for (i = 0; i < n; i++)
    for (j = i; j < n; j++):
        pass  # O(1)操作

分析：外层n次，内层分别为n, n-1, n-2...1，总和 = n(n+1)/2 = O(n2)
)idtitlecontentds_02u   栈和队列的性质与扩展u  ### 栈和队列的性质与扩展

**核心概念**
- 栈：LIFO，先进后出；操作：push/pop/top
- 队列：FIFO，先进先出；操作：enqueue/dequeue/front
- 循环队列：避免假溢出，用(n+1)个空间区分满/空

**易错点**
1. 循环队列队空条件：front == rear
2. 循环队列队满条件：(rear + 1) % maxsize == front
3. 中缀表达式转后缀表达式时，栈中存放操作符，优先级低的运算符在前

**出栈序列判定定理**
对于入栈序列1,2,3...,n的输出序列：每个数字后面比它小的数字必须按**递减顺序**排列。例如：入栈1,2,3,4，若出栈序列为4,3,2,1，对于数字4后面比4小的{1,2,3}必须递减排列（3>2>1 ✓）。

**典型题目**
使用两个栈实现队列：stack_in用于入队，stack_out用于出队
- 入队：元素压入stack_in
- 出队：如果stack_out不为空，弹出stack_out栈顶；否则把stack_in全部倒入stack_out
均摊时间复杂度：O(1)
ds_03u!   二叉树遍历与线索二叉树u  ### 二叉树遍历与线索二叉树

**核心概念**
- 先序遍历（DLR）：根-左-右
- 中序遍历（LDR）：左-根-右
- 后序遍历（LRD）：左-右-根
- 层序遍历：利用队列，层内从左到右

**易错点**
1. 已知两种遍历序列（包含中序），可唯一确定二叉树
2. 仅有先序+后序无法唯一确定（可确定祖先关系但不能确定结构）
3. 递归遍历时间复杂度O(n)，空间复杂度O(h)，h为树高

**线索二叉树**
- 目的：加快遍历速度，避免递归/栈
- 规定：若无左孩子，指向前驱；若无右孩子，指向后继
- 需要ltag/rtag标志位区分孩子指针和线索指针

**典型题目**
已知先序序列：ABDECF，中序序列：DBEAFC，构建二叉树
1. 先序根A → 中序分 DBE | A | CF
2. 左子树先序：BDE，中序：DBE → B为左子树根
3. 右子树先序：CF，中序：CF → C为右子树根
4. 结果：A左子B(B左D右E)，A右子C(C左F)
ds_04u!   图遍历：DFS与BFS及其应用u7  ### 图遍历：DFS与BFS及其应用

**核心概念**
- BFS（广度优先）：用队列，按层次遍历
- DFS（深度优先）：用栈（或递归），先深后广
- 时间复杂度：邻接表O(V+E)，邻接矩阵O(V2)

**易错点**
1. BFS计算最短路径（无权图）：首次到达即为最短
2. DFS生成树/森林：同一强连通分量的顶点可通过DFS访问
3. 邻接矩阵空间复杂度O(V2)，适合稠密图

**应用**
- BFS：最短路径（无权）、拓扑排序（Kahn算法）
- DFS：拓扑排序（基于DFS的逆序）、强连通分量（Kosaraju）

**典型题目**
拓扑排序算法（Kahn）：
1. 计算所有顶点入度
2. 将入度为0的顶点入队
3. 不断出队，删除边，更新入度
4. 若输出顶点数为V，则无环；否则有环
时间复杂度：O(V+E)
ds_05u3   查找算法：二分、平衡二叉树、散列表u6  ### 查找算法：二分、平衡二叉树、散列表

**二分查找**
- 条件：有序顺序表
- 时间复杂度：O(log n)
- 易错：边界条件，mid = left + (right - left) // 2

**平衡二叉树（AVL）**
- 定义：左右子树高度差绝对值小于等于1
- 旋转操作：LL（右单旋）、RR（左单旋）、LR（先左后右双旋）、RL（先右后左双旋）
- 插入：先 BST 插入，再调整平衡因子

**B树与B+树**
- B树：多路平衡查找树，节点包含数据
- B+树：非叶子节点只含索引，所有数据在叶子
- MySQL索引用B+树（叶子链表便于范围查询）

**散列表**
- 冲突处理：开放地址法（线性探测、二次探测）、链地址法
- 装填因子 = n/m，影响查找效率
- 开放地址法探测序列：h(key) = (h0 + f(i)) % m
os_01u'   进程与线程的区别及调度算法u  ### 进程与线程的区别及调度算法

**进程与线程**
- 进程：资源分配的基本单位，有独立地址空间
- 线程：CPU调度的基本单位，同一进程内共享资源
- 线程开销小：创建/切换/通信成本低

**易错点**
1. 进程切换vs线程切换：进程切换需要切换页表（TLB刷新），开销远大于线程切换
2. 线程不能独立拥有资源，仍需依赖进程的资源空间
3. 进程阻塞时同进程所有线程都阻塞（除主线程）

**调度算法**
- FCFS：简单，但 convoy effect（护航效应）
- SJF：最短优先，可能产生饥饿
- RR（时间片轮转）：适合分时系统，时间片大小关键
- 优先级调度：静态/动态优先级，可能饥饿（老化解决）
os_02u0   死锁：必要条件、预防、避免、检测u  ### 死锁：必要条件、预防、避免、检测

**死锁必要条件（Coffman条件）**
1. 互斥条件：资源一次只能被一个进程使用
2. 占有并等待：进程持有资源同时请求其他资源
3. 不可抢占：资源在释放前不可被抢占
4. 循环等待：形成进程-资源的循环链

**易错点**
1. 死锁预防：破坏任一条件即可，但可能导致资源利用率低
2. 死锁避免：Banker算法需要预先知道最大资源需求
3. 死锁检测：允许发生，定期检测并恢复

**银行家算法**
- 核心思想：分配前检查安全性
- Available：可用资源向量
- Max：最大需求矩阵
- Allocation：已分配矩阵
- Need = Max - Allocation
os_03u-   内存管理：分页、分段、虚拟内存u  ### 内存管理：分页、分段、虚拟内存

**分页存储管理**
- 逻辑地址 = 页号 + 页内偏移
- 页表：页号到页框号映射
- 快表（TLB）：高速缓存，减少访存次数
- 二级页表：解决大逻辑地址空间问题

**分段存储管理**
- 逻辑地址 = 段号 + 段内偏移
- 支持代码/数据/堆/栈等不同类型
- 段表：段号到基址+限长

**虚拟内存**
- 页面置换算法：FIFO、LRU、LFU、Clock(NRU)
- LRU近似：Clock算法（访问位+修改位）
- 颠簸（Thrashing）：频繁页面调度

**易错点**
1. 分页无外部碎片，分段有外部碎片
2. 快表命中只需一次访存，无TLB需两次
3. 页面淘汰时，修改位决定是否写回磁盘
os_04u!   文件系统和磁盘调度算法uI  ### 文件系统和磁盘调度算法

**文件系统**
- 连续分配：顺序访问快，随机访问快，但有外碎片
- 链接分配：消除碎片，但不支持随机访问
- 索引分配：支持随机访问，索引块问题

**Unix文件系统（inode）**
- inode包含：文件元数据（大小、时间戳、权限）+ 数据块指针
- 索引节点：直接指针12个，一级/二级/三级间接指针
- 最大文件大小：取决于间接索引层级

**磁盘调度算法**
- FCFS：简单，效率低
- SSTF（最短寻道）：可能饥饿
- SCAN（电梯算法）：来回扫描
- C-SCAN：单向扫描，返回快速
- LOOK：SCAN的改进，不走到端点

**易错点**
1. 磁臂黏性（armstickiness）：SSTF易产生同一磁道反复调度
2. 调度算法考虑：寻道时间、旋转延迟、传输时间
net_01u$   OSI七层模型与TCP/IP四层模型u  ### OSI七层模型与TCP/IP四层模型

**OSI七层**
1. 物理层：比特传输，接口标准（RJ45、光纤）
2. 数据链路层：帧传输，MAC地址，交换机（CSMA/CD）
3. 网络层：IP路由，路由器，三层交换
4. 传输层：TCP/UDP，端到端可靠传输
5. 会话层：会话管理，同步
6. 表示层：数据格式转换，加密解密
7. 应用层：HTTP、FTP、SMTP、DNS

**TCP/IP四层**
- 应用层（OSI 5-7）
- 传输层（OSI 4）
- 网际层（OSI 3）
- 网络接口层（OSI 1-2）

**易错点**
1. 路由器工作在网络层（三层），交换机工作在数据链路层（二层）
2. ARP将IP地址解析为MAC地址
3. NAT工作在网络层，转换IP头部地址
net_02u*   TCP三次握手四次挥手与可靠传输u  ### TCP三次握手四次挥手与可靠传输

**三次握手**
- 第一步：客户端SYN=1, seq=x → 服务端
- 第二步：服务端SYN=1, ACK=1, seq=y, ack=x+1 → 客户端
- 第三步：客户端ACK=1, seq=x+1, ack=y+1 → 服务端
- 双方同步初始序列号(ISN)

**四次挥手**
- 客户端FIN → 服务端
- 服务端ACK → 客户端
- 服务端FIN → 客户端
- 客户端ACK → 服务端
- TIME_WAIT：2MSL等待，确保最后ACK到达

**可靠传输机制**
- 序号机制：每个字节编号
- 确认机制（ACK）：累计确认
- 超时重传：RTT估计
- 流量控制：滑动窗口，接收方通告窗口
- 拥塞控制：慢启动、拥塞避免、快速恢复

**易错点**
1. TIME_WAIT存在原因：防止延迟数据被后续连接接收；确保对方收到最终ACK
2. 2MSL = 4分钟（通常），取决于实现
3. 连接建立是三次握手，连接释放是四次挥手（因为半关闭）
net_03u   IP协议与路由算法u6  ### IP协议与路由算法

**IPv4首部**
- 首部20字节（不含可选字段）
- 字段：版本、首部长度、总长度、标识、标志、片偏移、TTL、协议、首部校验和、源IP、目的IP
- TTL限制：最大255跳，每经过一个路由器减1

**IP地址分类**
- A类：1.0.0.0-126.255.255.255（/8）
- B类：128.0.0.0-191.255.255.255（/16）
- C类：192.0.0.0-223.255.255.255（/24）
- D类：多播地址，E类：保留

**特殊IP**
- 127.0.0.1：本地回环
- 0.0.0.0：默认路由
- 255.255.255.255：受限广播
- 私有IP：A类10.0.0.0/8，B类172.16.0.0/12，C类192.168.0.0/16

**路由算法**
- 距离向量（RIP）：跳数，周期性更新，易产生环路
- 链路状态（OSPF）：Dijkatra算法，快速收敛，无环路
- BGP：路径向量，用于AS间路由
net_04u   HTTP/HTTPS/DNS应用层协议u  ### HTTP/HTTPS/DNS应用层协议

**HTTP**
- 无状态协议，Web基础
- 请求方法：GET（获取）、POST（提交）、PUT（更新）、DELETE（删除）
- 状态码：1xx信息，2xx成功，3xx重定向，4xx客户端错误，5xx服务端错误
- HTTP/1.0：短连接，每次请求建立新TCP
- HTTP/1.1：持久连接（keep-alive），管道化
- HTTP/2.0：多路复用，头部压缩，服务端推送

**HTTPS**
- HTTP + TLS/SSL，端口443
- 加密：对称加密（内容）+ 非对称加密（密钥交换）+ 数字证书

**DNS**
- 层次结构：根域名服务器→顶级域名服务器→权威域名服务器
- 记录类型：A（域名到IPv4）、AAAA（域名到IPv6）、CNAME（别名）、MX（邮件）、NS（nameserver）
- 迭代查询vs递归查询
- 缓存：浏览器/OS/递归服务器

**易错点**
1. HTTP是无状态的，Cookie/Session解决状态问题
2. DNS使用UDP端口53（小型查询），大型查询用TCP
3. HTTP GET POST 区别：GET参数URL长度有限制，POST在body中更安全
arch_01u6   数据的表示：原码、反码、补码、浮点数u  ### 数据的表示：原码、反码、补码、浮点数

**定点数表示**
- 原码：符号位+绝对值，0正1负
- 反码：正数同原码，负数符号位不变，数值位取反
- 补码：正数同原码，负数反码+1；补码比原码/反码多表示一个最小负数
- 移码：补码符号位取反，用于浮点数阶码

**易错点**
1. 8位补码表示范围：-128 ~ +127（-2^7 ~ 2^7-1）
2. 补码优点：统一加减法，0的表示唯一
3. 符号扩展：正数高位补0，负数高位补1（保持数值不变）

**浮点数表示**
- IEEE 754：阶码（移码）+ 尾数（原码）
- 单精度(32bit)：1位符号 + 8位阶码 + 23位尾数
- 双精度(64bit)：1位符号 + 11位阶码 + 52位尾数
- 规格化：尾数最高位必须为1（隐含存储）

**IEEE 754特殊值**
- 阶码全0+尾数非0：非规格化数（逐步溢出）
- 阶码全1+尾数全0：无穷大
- 阶码全1+尾数非0：NaN
arch_02u)   指令系统：CISC与RISC、寻址方式u  ### 指令系统：CISC与RISC、寻址方式

**CISC（复杂指令集）**
- x86架构代表，指令长度不等，微程序控制
- 寄存器少，内存访问指令多
- 特点：指令丰富，但复杂指令执行效率低

**RISC（精简指令集）**
- ARM、MIPS代表，指令长度固定（32位），硬连线控制
- 寄存器多（32个），Load/Store架构
- 特点：指令简单，流水线效率高

**寻址方式**
1. 立即寻址：操作数在指令中
2. 寄存器寻址：操作数在寄存器
3. 直接寻址：操作数地址在指令中
4. 间接寻址：操作数地址在寄存器/内存中
5. 寄存器间接寻址：地址在寄存器
6. 相对寻址：PC相对偏移（用于分支/跳转）
7. 基址变址寻址：基址+变址+偏移

**易错点**
1. RISC不能执行复杂寻址（如x86的复杂地址模式）
2. 相对寻址用于控制转移指令，跳转范围有限
3. 堆栈寻址：隐含使用SP寄存器
arch_03u-   存储系统：Cache、虚拟存储器、RAIDu  ### 存储系统：Cache、虚拟存储器、RAID

**Cache**
- 映射方式：直接映射、组相联（N路组相联）
- 写策略：写直达（write-through）+ 写回（write-back）
- 写分配：先加载到Cache再写；写不分配：直接写内存
- 替换算法：FIFO、LRU、随机
- 命中率：h = Nc / (Nc + Nm)

**Cache/主存层次**
- 平均访问时间：Ta = h×Tc + (1-h)×(Tc + Tm)
- Tc：Cache访问时间，Tm：主存访问时间

**虚拟存储器**
- 页式：固定大小页，管理灵活，但有内部碎片
- 段式：按程序逻辑分段，便于共享保护
- 段页式：结合两者优点

**TLB（快表）**
- 命中率接近100%，减少页表访问
- 全相联/组相联

**易错点**
1. Cache对程序员透明，虚拟存储器对应用程序员透明
2. TLB是页表的Cache，属于MMU
3. 虚拟存储器以页为单位，交换单位是进程（整体换出）
arch_04u   CPU结构与指令流水线u5  ### CPU结构与指令流水线

**CPU基本组成**
- 运算器：ALU、累加器、暂存寄存器、程序状态字（PSW）
- 控制器：PC、IR、指令译码器、时序发生器
- 寄存器组：通用寄存器、专用寄存器（PC、IR、PSW、SP）

**指令周期**
- 取指周期→间址周期（若有）→执行周期→中断周期（若有）
- 机器周期：基本操作周期（通常=存取周期）
- 时钟周期：最基本定时单位

**指令流水线**
- 五级流水线：取指(IF)、译码(ID)、执行(EX)、访存(MEM)、写回(WB)
- 流水线吞吐率：T = n / (k+n-1)×Δt
- 加速比：S = k×n / (k+n-1)

**流水线冲突/冒险**
1. 结构冒险：硬件资源冲突，解决：增加资源
2. 数据冒险：数据依赖，解决：转发/暂停/编译器优化
3. 控制冒险：分支指令，解决：分支预测

**易错点**
1. 数据冒险包括：RAW（读后写）、WAR（写后读）、WAW（写后写）
2. 转发技术解决数据冒险，减少流水线暂停
3. 流水线深度的增加受限于物理条件和冲突
arch_05u   总线系统与I/O控制方式u&  ### 总线系统与I/O控制方式

**总线分类**
- 内部总线：CPU内部连接
- 系统总线：CPU与内存/外设（数据总线、地址总线、控制总线）
- 通信总线：I/O设备间通信（USB、PCIe）

**总线仲裁**
- 集中式仲裁：链式查询（优先级固定）、计数器定时查询、独立请求
- 分布式仲裁：自举分布式、冲突检测分布式

**总线性能**
- 总线带宽 = 总线宽度(bit) × 时钟频率(Hz) / 传输次数
- 总线复用：地址线与数据线分时复用
- 猝发传输（Burst）：一次传输多个数据

**I/O控制方式**
1. 程序查询方式：CPU主动轮询，占用CPU
2. 中断方式：设备主动通知CPU，CPU响应中断
3. DMA方式：DMA控制器管理数据传送，CPU不参与
4. 通道方式：独立处理器，执行通道程序

**易错点**
1. DMA与Cache一致性：DMA直接与内存交换数据，可能绕过Cache
2. 中断向量号→中断向量表→中断服务程序入口地址
3. 通道是更独立的I/O处理器，功能介于DMA和CPU之间
zknowledge_datastruct.mdzknowledge_os.mdzknowledge_network.mdzknowledge_arch.mduC   408考研真题 数据结构 时间复杂度 空间复杂度 王道u4   408考研真题 数据结构 栈 出栈序列 王道u4   408考研真题 数据结构 二叉树 遍历 王道u8   408考研真题 数据结构 DFS BFS 拓扑排序 王道uC   408考研真题 数据结构 二分查找 AVL B树 散列表 王道u=   408考研真题 操作系统 进程线程 调度算法 王道u:   408考研真题 操作系统 死锁 银行家算法 王道uJ   408考研真题 操作系统 内存管理 分页分段 虚拟内存 王道uC   408考研真题 操作系统 文件系统 磁盘调度 inode 王道uC   408考研真题 计算机网络 OSI七层 TCPIP 四层模型 王道uC   408考研真题 计算机网络 TCP三次握手 四次挥手 王道u<   408考研真题 计算机网络 IP协议 路由算法 王道u5   408考研真题 计算机网络 HTTP HTTPS DNS 王道uK   408考研真题 计算机组成原理 原码补码 浮点数 IEEE754 王道uC   408考研真题 计算机组成原理 CISC RISC 寻址方式 王道uF   408考研真题 计算机组成原理 Cache 虚拟存储器 TLB 王道uF   408考研真题 计算机组成原理 CPU流水线 指令周期 王道uB   408考研真题 计算机组成原理 总线 I/O DMA 中断 王道c                     t        j                         j                  d      }t        t        dd      5 }|j                  d| d|  d       d d d        y # 1 sw Y   y xY w)N%Y-%m-%d %H:%M:%Sautf-8encoding[] 
)r   nowstrftimeopenLOG_FILEwrite)msgtsfs       /home/ubuntu/tasks/study_cron.pylogr-   D   sW    		 	 !4	5B	hg	. #!	!B4r#b!"# # #s   AA!c                  
   t         j                  j                  t        d      } t         j                  j	                  |       r-t        | dd      5 }t        j                  |      cd d d        S g dd d i dS # 1 sw Y   xY w)Nstudy_tracker.jsonrr   r   r   learned_idsstudy_count
last_studylast_topic_idstats)ospathjoin	TASKS_DIRexistsr&   jsonload)pr+   s     r,   load_trackerr?   I   sm    
Y 45A	ww~~a!S7+ 	 q99Q<	  	 atVZeghh	  	 s   A99Bc                     t         j                  j                  t        d      }t	        |dd      5 }t        j                  | |dd       d d d        y # 1 sw Y   y xY w)Nr/   wr   r   F   )ensure_asciiindent)r7   r8   r9   r:   r&   r<   dump)tr>   r+   s      r,   save_trackerrG   P   sL    
Y 45A	aw	' 61		!QU156 6 6s   AAc                 j    t        j                  | j                               j                         d d S )N   )hashlibmd5encode	hexdigest)ss    r,   midrO   U   s'    ;;qxxz",,.r22    c           	      `   t         j                  | d      }|syt        d|        	 ddl}ddl}ddl}t        |dddd}|j                  |      j                  d	      }|j                  j                  d
|ddid      }|j                  j                  |d      5 }|j                  |j                         j                  d	            }ddd       t        dt        j                  dg              d       |S # 1 sw Y   3xY w# t         $ r}	t        d|	        Y d}	~	yd}	~	ww xY w)u'   使用Tavily搜索相关考研408真题 Nu   开始搜索真题：r   
   advancedF)api_keyquerymax_resultssearch_depthinclude_answerr   zhttps://api.tavily.com/searchzContent-Typezapplication/jsonPOST)dataheadersmethod   )timeoutu   搜索完成，获得 resultsu
    条结果u   搜索失败：)SEARCH_KEYWORDSgetr-   urllib.requesturllib.parser<   
TAVILY_KEYdumpsrL   requestRequesturlopenloadsreaddecodelen	Exception)
topic_idkeywordurllibjson_modrV   r[   reqrespresultes
             r,   search_exam_questionsrw   X   s3   !!(B/G
y)*== "&#
 ~~e$++G4nn$$+#%78	 % 
 ^^##C#4 	A^^DIIK$6$6w$?@F	A 	$SIr)B%C$DJOP		A 	A
  oaS!"s0   A6D /D 1D  D	D 	D-D((D-c           	         | syg }g }| j                  dd      }|r"t        |      dkD  r|j                  |dd        | j                  dg       D ]  }|j                  dd      |j                  dd      }t              d	kD  s6t        t        j                  d
            }t              }||z  dkD  rt              dk  rwt        fddD              r|j                  d| ddd         t        |      dk  st        fddD              s|j                  d| ddd          |dd |dd dS )u7   解析搜索结果，提取定理/技巧和典型题目NanswerrR      i  r`   r   r   r^   z[a-zA-Z]g333333?d   c              3   &   K   | ]  }|v  
 y wN .0ksnippets     r,   	<genexpr>z'parse_search_results.<locals>.<genexpr>   s     pA1<p   )u   定理u   技巧u   规律u   结论u   要点u   公式u   性质r!   r"   i,     c              3   &   K   | ]  }|v  
 y wr}   r~   r   s     r,   r   z'parse_search_results.<locals>.<genexpr>   s     *qA1<*qr   )u   题目u   例题u   题u   选项u   答案i     )theoremsexamples)rb   rm   appendrefindallany)	ru   r   r   	ai_answerr0   r   	eng_charstotal_charsr   s	           @r,   parse_search_resultsr   {   sK   HH 

8R(IS^b(	$3( ZZ	2& >%%	2&gr"w<"BJJ{G<=Ig,K;&,W1Cp)opp!E7"WTc]O <=X"s*qAp*q'q!E7"WTc]O <=> RaLRaL rP   c                    t        |      }|st        d       yt        |      }|r
|d   s|d   st        d       yt        j                  j                  t        |       }t        |dd      5 }|j                  d	       |d   rP|j                  d
       t        |d   d      D ]  \  }}|j                  | d| d        |j                  d       |d   r?|j                  d       t        |d   d      D ]  \  }}|j                  | d| d        |j                  d       ddd       t        d|         y# 1 sw Y   xY w)u!   搜索并追加真题相关内容u   未获得搜索结果，跳过Nr   r   u   解析结果为空，跳过r   r   r   u2   

---
### 🔍 考研真题相关定理与技巧

u   **定理/技巧：**
   z. r#   u   **典型真题摘录：**


z---
u   真题内容已追加到：)
rw   r-   r   r7   r8   r9   r:   r&   r(   	enumerate)	fnamero   ru   parsedfpr+   irF   exs	            r,   append_search_resultsr      sJ   "8,F,-!&)F&,VJ5G)*	i	'B	b#	( A	IJ*GG,-!&"4a8 '11#Rs"&'GGDM*GG12"6*#5q9 *21#Rt4()* 	
  
%eW-.! s   /B<EEc                 z   t        | j                  dg             }| j                  d      t        t        j	                               }d }r4t        j                         D ]  \  }}t        fd|D              s|} n |r'||v r#|j                  |      }||dz   d  |d |dz    z   }n|}|D ]=  }t        |   }|D 	cg c]  }	|	d   |vs|	 }
}	|
s&|t        j                  |
      fc S  t        d       g | d<   i | d<   t        |        |d   t        |d      }}|t        j                  |      fS c c}	w )	Nr2   r5   c              3   .   K   | ]  }|d    k(    yw)r   Nr~   )r   rF   r5   s     r,   r   zselect_topic.<locals>.<genexpr>   s     :1T7m+:s   r   r   uB   四科全部学完一轮！重置学习进度，进入下一轮...r6   r   )setrb   list
ALL_TOPICSkeysitemsr   indexrandomchoicer-   rG   )trackerlearnedorder	last_filer+   topslast_idxsearch_orderr   rF   
candidatesr5   s              @r,   select_topicr      sU   '++mR01GKK0M"#EI!'') 	GAt:T::		
 Y%';;y)XaZ[)E+8A:,>> 4% !%@A4)?a@
@&--
333	4 LMGMGG(JuQx04E&--%%% As    D8D8c                 d   t         j                  j                  t        |       }t	        j
                         j                  d      }dd d| d|d    dt        |d          dd d}t        |d	d
      5 }|j                  |       |j                  |d          d d d        y # 1 sw Y   y xY w)Nr   r   z<============================================================u   
📅 学习时间：u   
🏷️  知识点ID：r   z (MD5: z)
r   r   r   r   )
r7   r8   r9   r:   r   r$   r%   rO   r&   r(   )r   topicr   r*   hdrr+   s         r,   append_noter      s    	i	'B		 	 !4	5B.rd2KERVK=X_`cdijndo`p_qqtu{t|  }A  BC	b#	( "A		i !" " "s   7&B&&B/c                     dddddj                         D ]q  \  } }t        j                  j                  t        |       }t        j                  j                  |      rJt        |dd      5 }|j                  |       d d d        s t        j                  j                  t        d	      }t        j                  j                  |      st        g d
d d i d       y y # 1 sw Y   xY w)Nu?   # 📚 数据结构知识点笔记

> 考研408 - 数据结构
u?   # 📚 操作系统知识点笔记

> 考研408 - 操作系统
uE   # 📚 计算机网络知识点笔记

> 考研408 - 计算机网络
uQ   # 📚 计算机组成原理知识点笔记

> 考研408 - 计算机组成原理
r   rA   r   r   r/   r   r1   )	r   r7   r8   r9   r:   r;   r&   r(   rG   )r   r   r>   r+   tps        r,   
init_filesr      s    #g_ js	
 eg	!w GGLLE*ww~~a aw/ !1 ! !	! 
i!5	6B77>>"R`doqrs ! !s   .C  C)	c                     t        d       t                t               } | j                  d      }|re	 t	        j
                  |      }t	        j                         |z
  t        d      k  r*t        d|j                  d       d       t        d       y 	 t        |       \  }}t        d	|        t        d
|d    d|d    d       t        ||       t        dt         d|        t        ||d          | d   j                  |d          |d   | d<   | dxx   dz  cc<   t	        j                         j                         | d<   |j!                  dd      j!                  dd      }| d   j                  |d      dz   | d   |<   t#        |        t        d| d    d       t        d       y # t        $ r Y *w xY w)Nu   === 开始学习任务 ===r4   r   )hoursu   1小时内已学习过（z%H:%Mu   ），跳过本次u   === 学习任务跳过 ===u   选择科目文件：u   学习知识点：r   z (ID: r   )u   笔记已追加到：/r2   r5   r3   
knowledge_rR   z.mdr6   r   u   追踪器已更新 - 已学习 u    个知识点u   === 学习任务完成 ===)r-   r   r?   rb   r   fromisoformatr$   r   r%   rn   r   r   r:   r   r   	isoformatreplacerG   )r   r4   last_dtr   r   courses         r,   	run_studyr      s   $%LnG\*J	,,Z8G||~')!*<</0@0@0I/JJ\]^01 =  (LE5
w'(
U7^,F5;-qABu
	{!E734 %t-M!!%+.$T{GOMa$LLN446GL]]<,44UB?F&w/33FA>BGGV
)'-*@)AOP$%)  		s   A"F6 6	GG__main__) r7   r   r<   rJ   r   rc   rq   rd   urllib.errorr   r   r:   r'   re   	DS_TOPICS	OS_TOPICS
NET_TOPICSARCH_TOPICSr   ra   r-   r?   rG   rO   rw   r   r   r   r   r   r   __name__r~   rP   r,   <module>r      s   P P P P ( 	 H
 F  Te  f=  Kw  x@  Nx  y@  Nb  cR  `q  r	 F  Th  iO  ]B  CL  ZT  U@  Ns  t		 D  R|  }J  Xc  d7  EX  Y=  K  @	
 W  eu  vJ  Xr  sN  \K  L<  J_  `?  MS  T  ) &$	
RC C G	
 R L I Y R S S L E \ T  W!" W#$ S%*#
i6
3!FB/>&>"t!&F zK rP   