跳转到内容

computer-science / algorithms

算法

排序、图搜索、动态规划、哈希、加密、机器学习——解决问题的配方

55 篇

经典算法10 篇
计算机科学 · 算法

排序算法

Sorting Algorithms

把一列数字从小到大排好,看起来是个简单到无聊的问题。但排序是计算机科学里被研究最深、影响最广的问题之一。操作系统调度任务、数据库查找记录、搜索引擎返回结果、基因组学处理 DNA 序列——背后几乎都有排序在工作。高德纳(Donald Knuth)在《计算机程序设计艺术》第三卷整本书讲排序与搜索,不是偶然。

排序 · 时间复杂度 · 比较排序

计算机科学 · 算法

二分查找

Binary Search

在 1000 页的字典里查一个单词,没有人会从第一页开始逐页翻。人们翻到中间,判断目标词在左半还是右半,然后对着那半部分重复这个动作——几步就找到了。

二分查找 · 搜索算法 · 对数时间

被 2 个领域引用(数学、心理学)

计算机科学 · 算法 · 图论

图的遍历(BFS 与 DFS)

Graph Traversal — BFS and DFS

谷歌的网络爬虫访问 example.com,发现它链接到 a.com、b.com,然后访问 a.com,发现它链接到 c.com、d.com……这个过程叫做图遍历:系统地访问图中每一个可达节点,不重复、不遗漏。

BFS · DFS · 图遍历

被 2 个领域引用(数学、医学与公共卫生)

计算机科学 · 算法 · 图论

最短路径与 Dijkstra 算法

Shortest Path and Dijkstra's Algorithm

1956 年,荷兰计算机科学家艾兹赫尔·迪克斯特拉(Edsger W. Dijkstra)在阿姆斯特丹数学中心工作,那时没有鼠标、没有编辑器——程序员用铅笔在纸上写,然后把穿孔卡片送进去运行。

Dijkstra · 最短路径 · 图算法

被 1 个领域引用(生命科学)

计算机科学 · 算法 · 字符串处理

字符串匹配

String Matching

每次你按下 Ctrl+F 搜索一个词,每次你的 IDE 给你标出一个错误,每次 grep 在日志文件里找到一行记录——背后都有一个字符串匹配算法在工作。

字符串匹配 · KMP算法 · Boyer-Moore

被 1 个领域引用(医学与公共卫生)

计算机科学 · 算法 · 图论

最小生成树

Minimum Spanning Tree

1926 年,捷克数学家奥塔卡尔·博鲁夫卡(Otakar Borůvka)受摩拉维亚电力公司委托,研究如何用最少的电线把全国所有城镇连接成电网。他发表了第一个求解最小生成树的算法——比 Kruskal 和 Prim 的工作早了整整 30 年。

最小生成树 · Kruskal算法 · Prim算法

计算机科学 · 数学 · 信号处理

快速傅里叶变换

Fast Fourier Transform (FFT)

1965 年,James Cooley 和 John Tukey 在 Mathematics of Computation 上发表了一篇五页的论文"An Algorithm for the Machine Calculation of Complex Fourier Series",提出了快速傅里叶变换(FFT)算法。

FFT · 傅里叶变换 · 分治

被 5 个领域引用(数学、宇宙学、化学、语言学、宇宙物理)

计算机科学 · 信息论 · 数据压缩

霍夫曼编码

Huffman Coding

1951 年,麻省理工学院一门信息论课程上,教授 Robert Fano 给学生一个选择:要么参加期末考试,要么写一篇学期论文,证明一种最优的数据编码方案——能把信息压缩到尽可能短。Fano 自己(与香农一道)已经有一个接近但并非最优的方案(Shannon-Fano 编码)。

霍夫曼编码 · 数据压缩 · 贪心

被 2 个领域引用(生命科学、数学)

计算机科学 · 动态规划 · 组合优化

背包问题

Knapsack Problem

一位探险家准备出发,背包最多承重 $W$ 公斤。他面前有 $n$ 件宝物,每件有重量 $wi$ 和价值 $vi$。他应该带哪些宝物,才能让总价值最大,同时不超过背包承重?

背包问题 · 动态规划 · NP完全

被 1 个领域引用(医学与公共卫生)

计算机科学 · 算法 · 字符串处理

正则表达式

Regular Expressions

注册表单里检查邮箱格式的那行校验、IDE 里按下 Ctrl+Shift+F 的全局搜索、运维在几十 GB 日志里捞出某个错误码的那条 grep——它们背后是同一个工具:正则表达式。

正则表达式 · 有限自动机 · NFA

算法范式5 篇
密码学算法1 篇
机器学习算法8 篇
计算机科学 · 机器学习 · 数值优化

梯度下降与反向传播

Gradient Descent and Backpropagation

今天所有主流的神经网络——GPT、Stable Diffusion、AlphaFold、自动驾驶系统——都依赖两个核心算法在数以亿计的参数上共同工作:梯度下降告诉参数应该往哪个方向调整,反向传播高效地计算出"每个参数对误差贡献多少"。没有这两个算法,现代深度学习不可能在计算上可行。

梯度下降 · 反向传播 · 神经网络

被 2 个领域引用(数学、经济学)

计算机科学 · 机器学习 · 无监督学习

K-means 聚类

K-means Clustering

1957 年,Bell Labs 的 Stuart Lloyd 开发了一种信号量化算法,用于将连续信号压缩为有限个离散值——他将类似的点"聚合"到同一个"中心"附近。这个方法在 Bell Labs 内部流传了二十多年,直到 1982 年才正式发表。

K-means · 聚类 · 无监督学习

被 3 个领域引用(宇宙学、数学、政治学)

计算机科学 · 机器学习 · 有监督学习

决策树

Decision Trees

一个人去看医生,医生问:你发烧吗?是的。咳嗽吗?是的。呼吸困难吗?不。那么,可能是普通支气管炎。

决策树 · 信息增益 · 随机森林

被 4 个领域引用(宇宙学、经济学、医学与公共卫生、哲学思想)

计算机科学 · 机器学习 · 统计学习

支持向量机

Support Vector Machines

1995 年,贝尔实验室的科琳娜·科尔特斯(Corinna Cortes)和弗拉基米尔·万普尼克(Vladimir Vapnik)发表论文《支持向量网络》,奠定了支持向量机(Support Vector Machine, SVM)的现代形态。

支持向量机 · SVM · 核方法

被 2 个领域引用(宇宙学、数学)

计算机科学 · 机器学习 · 集成学习

随机森林

Random Forests

2001 年,利奥·布雷曼(Leo Breiman)在《机器学习》杂志发表了题为《随机森林》的论文,提出了一个简单但极其有效的思想:一棵决策树不稳定、容易过拟合,但一千棵随机生长的决策树投票,却能得到稳定而准确的预测。

随机森林 · 集成学习 · 决策树

被 1 个领域引用(化学)

计算机科学 · 机器学习 · 集成学习

梯度提升

Gradient Boosting

2001 年,斯坦福大学教授杰罗姆·弗里德曼(Jerome Friedman)发表论文《贪婪函数近似:梯度提升机》,将函数空间的梯度下降与集成学习结合,创造了梯度提升(Gradient Boosting)框架。

梯度提升 · XGBoost · 集成学习

计算机科学 · 机器学习 · 强化学习

Q 学习与强化学习

Q-Learning and Reinforcement Learning

1992 年,克里斯托弗·沃特金斯(Christopher Watkins)和彼得·达扬(Peter Dayan)发表论文,为 Q 学习(Q-Learning)算法提供了收敛证明。

Q学习 · 强化学习 · 马尔可夫决策过程

被 2 个领域引用(哲学思想、经济学)

计算机科学 · 机器学习 · 降维

主成分分析

Principal Component Analysis

主成分分析(Principal Component Analysis, PCA)的历史可以追溯到 1901 年,由卡尔·皮尔逊(Karl Pearson)在《哲学杂志》发表的论文中首次提出(作为拟合"最接近的直线和平面"的方法);现代矩阵形式由哈罗德·霍特林(Harold Hotelling)在 1933 年完善。

PCA · 降维 · 特征提取

被 3 个领域引用(宇宙学、经济学、数学)

图算法7 篇
计算机科学 · 图论 · 优化

网络流

Network Flow

1956 年,美国空军系统分析师 T.E. Harris 写了一份机密备忘录,估算若苏联遭受核打击后,铁路网络能承载多少物资流量。这个问题后来成为一道经典算法题目的直接来源。

网络流 · 最大流 · 最小割

被 5 个领域引用(经济学、生命科学、医学与公共卫生、政治学、宇宙物理)

计算机科学 · 人工智能 · 搜索

A* 搜索算法

A* Search Algorithm

1968 年,Stanford Research Institute 的三位研究员——Peter Hart、Nils Nilsson 和 Bertram Raphael——在开发一台机器人(Shakey)的导航系统时,需要一种高效的路径规划算法。

A* · 启发式搜索 · 路径规划

被 1 个领域引用(数学)

计算机科学 · 图论 · 最短路径

贝尔曼-福特算法

Bellman-Ford Algorithm

Richard Bellman(动态规划的奠基人)在 1958 年的论文《On a Routing Problem》中、Lester Ford Jr.(最大流-最小割定理的共同提出者,他与 Fulkerson 的最大流论文发表于 1956 年)在更早的 RAND 报告中,分别给出了处理含负权边图的最短路径算法。

贝尔曼-福特 · 最短路径 · 负权边

被 1 个领域引用(数学)

计算机科学 · 图论 · 最短路径

Floyd-Warshall 算法

Floyd-Warshall Algorithm

1962 年,两位研究者几乎同时发表了全对最短路径算法。Robert Floyd 在 Communications of the ACM 上发表了"Algorithm 97: Shortest Path";Stephen Warshall 的先前工作(1962 年,针对图的传递闭包)提供了相同的矩阵递推框架。

Floyd-Warshall · 全对最短路 · 动态规划

计算机科学 · 图论

拓扑排序

Topological Sort

你敲下 make 编译一个 C 项目,或者 npm install 装一堆依赖包:a.o 必须先于 b.o 编译,库 X 必须先于依赖它的库 Y 安装。构建工具要做的第一件事,就是把这张"谁依赖谁"的关系图,理成一条所有依赖都排在前面的执行顺序——这就是拓扑排序(Topological Sort)。

拓扑排序 · 有向无环图 · DAG

被 2 个领域引用(宇宙学、数学)

计算机科学 · 信息检索 · 图论

PageRank 算法

PageRank Algorithm

1998 年,斯坦福大学的两位博士生 Larry Page 和 Sergey Brin 在论文"The Anatomy of a Large-Scale Hypertextual Web Search Engine"中描述了一种给网页打分的方法,并用它建立了一个新的搜索引擎。

PageRank · 搜索引擎 · 随机游走

被 2 个领域引用(数学、哲学思想)

当代

匹配算法

Matching Algorithms

1965 年,杰克·埃德蒙兹(Jack Edmonds)发表《Paths, Trees, and Flowers》。论文要解决的是一般图上的最大基数匹配:任意一对顶点最多共用一条边,怎样选出尽量多的边。二部图当时已有匈牙利方法和网络流;非二部图会被奇数环绊住。

二部匹配 · 霍普克罗夫特-卡普 · 花朵算法

数据结构4 篇
概率数据结构2 篇
计算几何1 篇
优化算法1 篇
数值算法1 篇
随机算法1 篇
元启发式算法2 篇
深度学习3 篇
计算理论与算法1 篇
字符串算法2 篇
系统算法2 篇
分布式算法2 篇
检索与索引1 篇
并行与分布1 篇