跳转至

2023

线程相关

进程: 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程。

线程: 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

与进程不同的是同类的多个线程共享进程的 堆**和**方法区 资源,但每个线程有自己的 程序计数器、虚拟机栈和本地方法栈 ,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

位运算

位操作(Bit Manipulation)是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代编程语言中,情况并非如此,很多编程语言的解释器都会基本的运算进行了优化,因此我们在实际开发中可以不必做一些编译器已经帮我们做好的优化,而就写出代码本身所要表现的意思。

动态规划

动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

动态规划常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法所耗时间往往远少于朴素解法。

动态规划有自底向上和自顶向下两种解决问题的方式。自顶向下即记忆化递归,自底向上就是递推。

使用动态规划解决的问题有个明显的特点,一旦一个子问题的求解得到结果,以后的计算过程就不会修改它,这样的特点叫做无后效性,求解问题的过程形成了一张有向无环图。动态规划只解决每个子问题一次,具有天然剪枝的功能,从而减少计算量。

有效资产管理

第一章 总论

想象一下,每年在你的个人养老金账户中存入 \(5000\) 元,或者直接交到你的手中,如果放入养老金账户中,需要进行掷硬币来决定收益(\(30\%\))或亏损(\(10\%\)),直接交到你的手中将会有每年 \(3\%\) 的收益率。哪种方案更好一点?

这是一个简单的投资方案,你意识到掷硬币会产生两种可能的结果,每种结果都有相同的概率:

序号 结果 总收益率
1 正面 \(30\%\)
2 反面 \(-10\%\)

既然发生的概率相同,且在一个有代表性的两年实践中,这两种结果各会发生一次,你会发现自己的养老金会进行如下增长:

\[1.3*0.9=1.17\]

你在两年前所拥有的每 \(1\) 元到现在都变成了 \(1.17\) 块,精通数学的你计算出来掷硬币的年化收益率是 \(8.17\%\),这明显比每年 \(3\%\) 的收益要高的多。当然你可能会遇到一连串的衰运让你得到的背面要比正面要多,但当你进行一些试算后,你会发现要想获得第一个选择的收益,需要得到最多 \(12\) 个正面和最少 \(23\) 个背面,这种倒霉的事情发生的概率实在太低。

所以我们得出了第一条规律:

在“安全的”货币市场账户和财政部债券以及“赌博性质的”普通股中进行选择。第二个选择提供了几乎确定无疑的更高回报,但这同样需要付出代价:存在很小的亏损概率,更重要的是每年都要经历令人痛苦的弗雷德叔叔的投掷硬币环节。但 \(3\%\) 的银行存款单的选择才是最让人恐惧的——你将注定贫穷地度过你的老年

第二章 风险和收益

  1. 风险和收益无论如何都是分不开的,不要期望在获得高收益的同时还能享有低风险,不要在厌恶低回报的同时还渴望资产具有安全性。
  2. 风险资产的持有期越长,遭受严重损失的概率就越低。
  3. 资产或投资组合的风险是可以度量的。最简便的方法是计算出各个时期收益的标准差。
  4. 那些不关注投资历史记录的人将会屡次犯错。人们应该仔细研究投资收益和风险的历史数据。存续期足够长(通常超过 20 年)的资产投资数据对预测该资产未来收益和风险很有帮助。此外估算由该资产组成的投资组合未来长期收益和风险也是可以实现的。

第三章 多元资产投资组合的市场表现

掷硬币的另一种选择

Service Mesh

A service mesh, like the open source project Istio, is a way to control how different parts of an application share data with one another. Unlike other systems for managing this communication, a service mesh is a dedicated infrastructure layer built right into an app. This visible infrastructure layer can document how well (or not) different parts of an app interact, so it becomes easier to optimize communication and avoid downtime as an app grows.

Istio 架构

Istio 就是 Service Mesh2 架构的一种实现,服务之间的通信(比如这里的 Service A 访问 Service B)会通过代理(默认是 Envoy1)来进行。

关于算法中的问题总结

在刷题的过程中遇到了一些经典问题和经典解法,我觉得很有必要对其进行归纳与总结,避免未来遇到同样的问题捉急。

递归/回溯

递归是计算机科学中的一个重要概念。它是许多其他算法和数据结构的基础。然而,对于许多初学者来说,掌握它可能是一件非常棘手的事情。

每当递归函数调用自身时,它都会将给定的问题拆解为子问题。递归调用继续进行,直到到子问题成为一个不可以拆分的、可以直接求解的最简单问题。

为了确保递归函数不会导致无限循环,它需要包含:

一个简单的基本案例(basic case)(或一些案例), 能够不使用递归来产生答案的终止方案。 一组规则,也称作递推关系(recurrence relation),可将所有其他情况拆分到基本案例。 注意,函数可能会有多个位置进行自我调用(这是分治算法)。

深度优先搜索

深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.

因发明「深度优先搜索算法」,约翰 · 霍普克洛夫特与罗伯特 · 塔扬在1986年共同获得计算机领域的最高奖:图灵奖。

广度优先搜索

广度优先搜索算法(Breadth-First Search,缩写为 BFS),又称为宽度优先搜索,是一种图形搜索算法。简单的说,BFS 是从根结点开始,沿着树的宽度遍历树的结点。如果所有结点均被访问,则算法中止。