这是一个怎样的博客?点击进入博客指南
这是我的第一篇个人博客,接下来将为您介绍:
本博客如何食用、我的联系方式、其他博客推荐
这是我的第一篇个人博客,接下来将为您介绍:
本博客如何食用、我的联系方式、其他博客推荐
原文:Introduction to the A* Algorithm,本文略有改动
2024新年伊始,我也到了要准备工作的时候了,我计划开始写一篇长篇的C++面经整理,记录看到的点滴面经。
目录:(一级标题:知识框架;二级标题:知识领域;三级标题:面试问题:四级:内容)
- C++语言
- 特性
- 原理
- 内存安全
- 工具
- 算法题
- Linux
- 操作系统
- 计算机网络
- 设计模式
- 测试调优
- 数据库原理
预处理阶段:在这个阶段,预处理器处理源文件中的预处理指令,比如 #include
、#define
等。预处理器会根据这些指令展开头文件并替换宏定义,生成一个经过预处理的源文件。
1 | $ g++ -E source.cpp -o source.ii |
编译阶段:编译器将预处理后的源文件转换成汇编代码。在这个阶段,编译器会对源文件进行词法分析、语法分析和语义分析,并生成相应的中间代码或汇编代码。
1 | $ g++ -S source.ii -o source.s |
汇编阶段:汇编器将汇编代码转换成机器码或者目标文件。在这个阶段,汇编器会将汇编代码转换成可重定位的机器码,并生成目标文件。
1 | $ as source.s -o source.o |
链接阶段:链接器将目标文件和库文件链接在一起,生成最终的可执行文件。在这个阶段,链接器会解析目标文件之间的引用关系,将它们连接到正确的位置上,并将库文件中的函数和变量链接到可执行文件中。
1 | $ g++ source.o -o executable |
在归并排序中加一行公式计算原序列逆序数
在合并过程中,如果a[i]大于a[j],那么a[i]后面的元素也都大于a[j],所以逆序对的数量就是从i到mid的元素的数量,即mid - i + 1
。
1 | #include <iostream> |
参考同上
muduo作者写的三个半:
https://blog.csdn.net/Solstice/article/details/6171831
我认为,TCP 网络编程最本质的是处理三个半事件:
- 连接的建立,包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接;
- 连接的断开,包括主动断开 (close 或 shutdown) 和被动断开 (read 返回 0);
- 消息到达,文件描述符可读。这是最为重要的一个事件,对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,如何处理分包,应用层的缓冲如何设计等等);
- 消息发送完毕,这算半个。对于低流量的服务,可以不必关心这个事件;另外,这里“发送完毕”是指将数据写入操作系统的缓冲区,将由 TCP 协议栈负责数据的发送与重传,不代表对方已经收到数据。
转载记:作者的专业水平虽然大部分人达不到,但是可以作为学习计算机编程的一个清单,文章很多经验之谈在学长学姐那里也听过,脚踏实地,立意高远。
作者于2015年博士毕业加入一家量化私募公司,刚好做了四年系统工程师的工作。本文作为这个岗位所用到的技能总结,希望对想进入这个行业的人有所帮助。本人非科班出身,工作中用的技术大多数通过自学获得,有不足之处还请同行多多指教,有好的学习资料希望不吝推荐!
量化交易这些年在国内方兴未艾,这几年国外顶级量化交易公司纷纷进入国内来捞金。预计未来量化交易在中国会有一个长足发展。一般量化团队分两类技术工种,策略开发岗和系统开发岗。本文介绍系统开发岗涉及的一些技术知识,文中前面几点C++、 操作系统、网络等是核心技能,后面几点是辅助技能。精学其中的一部分就足以找到工作。
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
输入:一个加权连通图,其中顶点集合为V,边集合为E;
初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
递归下列操作,直到Vnew = V:
输出:使用集合Vnew和Enew来描述所得到的最小生成树。
只做出A、L就只写这两吧(雾
1 | const int N = 100010; |
1 | const int N = 100010; |
当我们做一件事的时候,我们会发现,几乎只要时间足够充裕,几乎所有的事情都能够做的很好。然而,现实并不会给我们那么多的机会。
我们所做的一切都是有限的,我们的时间是有限的,我们的人力是有限的,我们的精力是有限的、所调动的资源、所能汲取到的智慧等等都是有限的,那些近乎无限的条件往往是不存在的,所以我们必须认识到这一点,我们生活在一个有限度的世界里,而衡量我们有没有成就的标准,就是我们能否在有限的时间里,完成一项工作。
就拿高中生举个例子,学生与老师在学习上最大的不同在于,老师可以用二三十年的时间,不断深入研究学习高中的知识体系和教育,单纯以教学质量来考量,这是一个近乎理想的模型,而学生却不一样,学生只能在2-3(4)年的时间内完成整个规则的学习和应用,衡量学生是否成功的,就是他们是否在最后的教育成果上有个结果。
1 | bool is_prime(int x) |
1 | void divide(int x) |
1 | int primes[N], cnt; // primes[]存储所有素数 |
介绍参考文末引用文章
1 | int primes[N], cnt; // primes[]存储所有素数 |
1 | vector<int> get_divisors(int x) |
欧拉函数是求小于等于n的数中与n互质的数的数目
1 | int phi(int x) // phi 是欧拉函数/fa/读音 |
1 | int primes[N], cnt; // primes[]存储所有素数 |
来自博客园
需要用到如下性质
p为质数
$phi(p)=p-1$ 因为质数 p 除了 1 以外的因数只有 p,故 1 至 p 的整数只有 p 与 p 不互质
如果i mod p = 0, 那么 $phi(i * p)=phi(i) * p$
若i mod p ≠0, 那么 $phi( i * p )=phi(i) * ( p-1 )$
1 | #include<cstdio> |
原理:$A^{n}=(A^{n/2})^2$
如果是偶数幂,计算平方根次幂
如果是奇数幂,计算$n - 1$次幂
递归实现(伪代码)
1 | int binpow(int a,int n){ |
利用十进制转二进制的原理,可以进行非递归运算
非递归优化(C++)(位运算)
1 | int binpow(int a,int n){ |
1 | 方法1 gcd(a,b)=gcd(b,a mod b) if b == 0 return |
可扩展至 gcd(a,b,c,…,n)
文章首次写于:2023-04-19
更新日志:
20230419:编写了字符串-C、字符串-C++的输入输出
20230916:添加了< String >库、< cctype >库、字符串流 < sstream >库
经典ICG博弈算法(Impartial Combinatorial Games 公平组合游戏)
BFS+三维,一直WA找不到问题,后来发现是没有初始化(菜