一封信:给 CS 新人的大学生存指南

Keywords: #comment

软件工程师常被戏称作「高级谷歌工程师」,这或许是因为在软件开发过程中,工程师往往要耗费大量的时间在搜索引擎上寻找资料,其时长甚至要超过编写软件代码这项任务本身。依我愚见,这一现象的根本原因在于计算机领域的知识大多是高度开放且频繁迭代的。 高度开放体现在计算机领域的专业知识并非为少数人所垄断的,一个中学生(例如我)通过在互联网上搜索就能学会搭建网站、编写软件,甚至为大型开源项目做贡献。这种开放程度在法律或医学等传统领域是不可想象的,你很难通过自学就学会打官司或做手术。迭代频繁则体现在工业界所使用的技术每两三年就会发生翻天覆地的变化,编程语言、应用框架乃至操作系统都在不断更新;工程师若想不落后于时代,就必须做到终身学习。这种更迭速度在法律或医学等「学习一次,适用终身」的行业内同样是难以想象的。这种高度开放和频繁迭代导致了一个工程师,无论如何聪明,都可以、也必须不停地从外界汲取新的知识 —— 这个「外界」通常就是指互联网,或者狭义上的「谷歌」。

作为一个 CS 专业的大学生,你未来很可能会成为一名软件工程师。当然,你也有可能走上学术的道路,或者干脆离开这个行业 —— 这两条道路我也还知之甚少,不敢多说。但是关于如何用好大学时间成长为一名更优秀的工程师这点,我想根据我的所见所闻为你提供一点参考建议。

Naive Bayes Classifier 简洁教程

Keywords: #machine learning

本文将简单的介绍朴素贝叶斯分类器(Naive Bayes Classifier)的数学原理,包括贝叶斯定理、朴素贝叶斯分类器、参数估计、Laplace 校准等。用 numpy 实现 Naive Bayes Classifier 并不困难,各类机器学习框架中大多也已有高可用的实现,因此本文不会再代码细节上多做赘述。

Naive Bayes Classifier 其实相当“朴素”,抛开对“机器学习”这一名词的无端恐惧,你就会发现其本只不过是一些列的概率计算 —— 下面就开始正文。

C++20 <=> Space-Ship 操作符介绍

Keywords: #c++

C++20 计划引入 <=> 操作符,学名是 Three-Way Comparison Operator,俗称 Space Ship Operator —— 这个运算符的引入从根本上重新定义了 C++ 如何进行比较,并且为比较系统带来了极大的灵活性,可能会大量缩减重复代码。这篇博客就简单介绍一下 <=> 操作符的用法。

Manacher 算法分析与实现

Keywords: #algorithm #c++

最近刚做完 Leetcode 上的 Longest Palindromic Substring,用的是 Manacher 算法(国内俗称马拉车算法)。之前高中打 OI 时也做过同样的题目,不过当时是作为动态规划的例题来介绍的;再加上后来我没认真学 Manacher 算法,所以直到这几天才算是初步学习了该算法。

Manacher 算法是一种能以 O(n) 的时间复杂度找出一个字符串里的所有回文子串的算法。相比于暴力搜索(O(n^3))与动态规划/中心扩展(O(n^2)),它的时间复杂度要低得多。这篇博客就简单记录一下我对 Manacher 算法的理解。

思考自我:工作之外的生活

Keywords: #prose

在现代人的语境中,工作与生活几乎是彻底对立、无法共存的词汇 。我是基本上支持这个观点的,尽管情绪没有那么强烈 —— 或许因为我还是学生 。但今天我想讨论 —— 与其说是讨论,不如说反思更为贴切 —— 的就是现代人的工作性质所导致的工作与生活在语义上的分离,以及我们该如何编排工作之外的生活 。