大家好,我是木木。
今天给大家分享一个实用的 Python 库,algorithms。
algorithms
它收录了排序、搜索、图论、动态规划、回溯、贪心等经典算法的纯 Python 实现,每个文件都自包含、带文档字符串和复杂度标注,适合学习和面试准备。
项目地址:https://github.com/keon/algorithms
官方文档:https://github.com/keon/algorithms/blob/master/README.md
三个特点
代码精简
每个算法都是独立文件,代码量控制在几十行以内,docstring 写明原理、复杂度和引用。读一个文件就能理解一个算法,不像教科书那么厚。
覆盖面广
涵盖排序、搜索、图论、树、动态规划、回溯、贪心、位运算、字符串、数学、堆、栈、链表、集合、队列、矩阵等 20+ 分类,数百个算法实现。
即装即用
pip install algorithms 后直接 import 调用,不用自己手写。数据结构类(BinaryHeap、Trie、BST)可以直接在项目里复用。
最佳实践
安装后直接导入使用,零配置。
pipinstallalgorithms
排序算法实践
这段代码解决什么问题:演示 merge_sort 和 quick_sort 对乱序数组的排序效果,对比两种经典排序算法的输出。
fromalgorithms.sortingimportmerge_sort,quick_sortarr1=[38,27,43,3,9,82,10]print('Input:',arr1)print('Merge Sort:',merge_sort(arr1))arr2=[5,1,8,3,7,2,9,4,6]print('Input:',arr2)print('Quick Sort:',quick_sort(arr2))
两种排序算法都能正确返回升序结果。merge_sort 是稳定排序,时间复杂度 O(n log n);quick_sort 平均 O(n log n) 但最坏 O(n²)。根据场景选择合适的排序算法很重要。
图论 — Dijkstra 最短路径
这段代码解决什么问题:在有向加权图中,用 Dijkstra 算法找到从起点到终点的最短路径和代价。
fromalgorithms.graphimportdijkstragraph={'s':{'a':2,'b':1},'a':{'s':3,'b':4,'c':8},'b':{'s':4,'a':2,'d':2},'c':{'a':2,'d':7,'t':4},'d':{'b':1,'c':11,'t':5},'t':{'c':3,'d':5},}cost,path=dijkstra(graph,'s','t')print(f'Cost: {cost}, Path: {path}')
从节点 s 到 t 的最短路径是 s → b → d → t,总代价 8。Dijkstra 是单源最短路径的经典算法,适合非负权图。如果你需要处理负权边,可以考虑 Bellman-Ford。
高级功能
数据结构 — 二叉堆和字典树
这段代码解决什么问题:演示 BinaryHeap 的插入和最小值弹出,以及 Trie 的插入、精确搜索和前缀搜索。
fromalgorithms.data_structuresimportBinaryHeap,Trieheap=BinaryHeap()forvalin[5,3,8,1,9]:heap.insert(val)print('remove_min:',heap.remove_min())print('remove_min:',heap.remove_min())trie=Trie()forwordin['apple','app','application','bat']:trie.insert(word)print('search apple:',trie.search('apple'))print('search apt:',trie.search('apt'))print('starts_with ap:',trie.starts_with('ap'))
BinaryHeap 每次 remove_min 返回当前最小值(1、3),底层自动维护堆结构。Trie 支持 O(k) 的字符串插入和搜索,starts_with 前缀查询在前缀匹配场景中非常有用,比如自动补全。
适用 / 不适用场景
适用:
- 学习算法和数据结构,每个文件都是独立可读的教学代码。
不适用:
- 需要生产级高性能算法库(建议用 NumPy、SciPy、networkx 等优化过的库)。
- 超大规模数据处理场景(这些实现是教学级别的,未做极致优化)。
上线前检查清单
- 确认算法复杂度符合你的业务场景,不要在生产环境直接用于大规模数据。
- 建议只 import 需要的具体算法,避免全量导入。
- 贡献代码前先看 CONTRIBUTING.md,确保风格一致。
总结
如果你在学习算法、准备面试,或者项目中需要一个现成的算法实现,algorithms 是一个非常实用的工具库。每个文件都干净利落,读起来像在翻一本算法笔记。