长桥寂寞春寒夜

Naive Bayes Classifier 简洁教程

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

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

......

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

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

......

Manacher 算法分析与实现

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

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

......

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

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

......

Nilsh:从零开始实现交互式 Shell

最近被生活所迫尝试制作 Shell —— 注意是 Interactive Shell 而非 Shell Interpreter 。参照《现代操作系统》一书的描述,Shell 的基本原理就是 fork-and-execute 。程序的基本框架看起来可能是这样的:

#define TRUE 1

while (TRUE) {
  type_prompt();
  read_command(command, parameters);
  if (fork() == 0)
    execve(command, parameters, 0);
  else waitpid(-1, &status, 0);
}

当然实际实现过程中还是遇到了不少其他问题,这篇博客就简单记录下这些问题及其解决 。我的源代码就托管在 GitHub 上。

......

与抽象共存:来自计算机科学的感想

抽象(Abstraction)是计算机科学中一个常见的概念 —— 在生活中也很常见 。但我们在日常生活中提及抽象时,往往是为了描述某个事物复杂而难以理解,却往往忽略了抽象背后的统一性 。私将抽象理解为“从一系列复杂的具体事物中抽离出有意义的统一形象”,事物的复杂性是抽象存在的土壤 。事先声明,写这篇博客并非为了从技术的角度阐述计算机科学中抽象的概念,而是单纯的有感而发 —— 是因为我在为时尚短的大学生活中发现的抽象能力的普遍缺乏 。这让我感到不安 。

......

Flask + Celery + Redis 实现异步处理任务队列

最近正在尝试编写网站,其中一个功能是帮助用户从某个 URL 抓取信息 —— 也就是爬虫 。但众所周知,爬虫程序由于 I/O 阻塞通常会消耗较长的时间,无法第一时间对用户请求作出响应 。因此我们会希望让爬虫任务在后台处理,等到执行成功/失败后再将结果返回给用户;而任务队列就作为 Web 后端接口与爬虫处理程序之间的一个中介,负责传输任务的具体内容和执行结果 。这篇博客不会具体阐述 Flask Web 开发或 Python 爬虫的相关技术,而将重点聚焦于使用流行的开源异步任务处理框架 Celery 实现一个任务队列的基本功能 。

(我才不是出于咕咕咕的负罪感连更博客的)

......

C++ virtual 关键字浅析:多态、抽象与多继承

C++ 的虚函数算是比较高级的语法特性之一,通过 virutal 关键字来定义,主要用于实现面向对象编程中的多态;virtual 关键字还可以用来定义虚函数,主要用于实现面向对象编程中的抽象;而且多继承的实现也需要用到 virtual 关键字 。既然 virutal 关键字这么有用,那就写(水)篇博客记录一下吧!

......