{"id":18773941,"url":"https://github.com/ejunjsh/algs4","last_synced_at":"2025-06-12T19:37:41.961Z","repository":{"id":109690968,"uuid":"110849632","full_name":"ejunjsh/algs4","owner":"ejunjsh","description":"this place is where i take notes from book 《算法(第四版)》","archived":false,"fork":false,"pushed_at":"2018-12-15T07:01:54.000Z","size":559,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-29T08:41:59.471Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ejunjsh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-11-15T15:16:31.000Z","updated_at":"2018-12-15T07:02:43.000Z","dependencies_parsed_at":"2023-03-12T20:45:35.938Z","dependency_job_id":null,"html_url":"https://github.com/ejunjsh/algs4","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejunjsh%2Falgs4","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejunjsh%2Falgs4/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejunjsh%2Falgs4/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejunjsh%2Falgs4/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ejunjsh","download_url":"https://codeload.github.com/ejunjsh/algs4/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239680985,"owners_count":19679509,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T19:36:22.293Z","updated_at":"2025-02-19T15:17:17.489Z","avatar_url":"https://github.com/ejunjsh.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# algs4\nthis place is where i take notes from book \"algs4\"\n\n# chapter01 基础\n* 1.1 [下压（LIFO）栈（能够动态调整数组大小的实现）](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/ResizingArrayStack.java)\n* 1.2 [下压堆栈（链表实现）](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Stack.java)\n* 1.3 [先进先出队列](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Queue.java)\n* 1.4 [背包](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Bag.java)\n* 1.5 union-find的实现\n    * [quick-find算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/QuickFindUF.java)\n    * [quick-union算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/QuickUnionUF.java)\n    * [加权quick-union算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/WeightedQuickUnionUF.java)\n\n\n    \n算法|构造函数|union()|find()\n----|------|-------|-------\nquick-find算法|N|N|1\nquick-union算法|N|树的高度|树的高度\n加权quick-union算法|N|lgN|lgN\n\n\n\n# chapter02 排序\n* 2.1 [选择排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Selection.java)\n* 2.2 [插入排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Insertion.java)\n* 2.3 [希尔排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Shell.java)\n* 2.4 归并排序\n    * [自顶向下](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Merge.java)\n    * [自底向上](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/MergeBU.java)\n* 2.5 快速排序\n    * [基础](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Quick.java)\n    * [三向切分](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Quick3way.java)\n* 2.6 优先队列\n    * [基于堆的](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/MaxPQ.java)\n    * [有索引并基于堆的](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/IndexMaxPQ.java)\n* 2.7 [堆排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Heap.java)\n\n\n\n算法|是否稳定|是否为原地排序|时间复杂度|空间复杂度|备注\n---|-------|------------|-------|--------|-----\n选择排序|否|是|N^2|1|\n插入排序|是|是|介于N和N^2之间|1|取决于输入元素度排列情况\n希尔排序|否|是|NlogN? or N^6/5|1|\n快速排序|否|是|NlogN|lgN|运行效率由概率提供保证\n三向快速排序|否|是|介于N和NlogN之间|lgN|运行效率有概率保证，同时也取决于输入元素的分布情况\n归并排序|是|否|NlogN|N|\n堆排序|否|是|NlogN|1|\n\n\n# chapter03 查找\n* 3.1 [顺序查找（基于无序链表）](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/SequentialSearchST.java)\n* 3.2 [二分查找（基于有序数组）](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/BinarySearchST.java)\n* 3.3 [基于二叉查找树的符号表](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/BST.java)\n* 3.4 [基于红黑树的符号表](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/RedBlackBST.java)\n* 3.5 [基于拉链法的散列表](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/SeparateChainingHashST.java)\n* 3.6 [基于线性探测的散列表](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/LinearProbingHashST.java)\n\n\n算法（数据结构）| 最坏情况下的运行时间的增长数量级（N次插入之后）(查找:插入)|平均情况下的运行时间的增长数量级（N次随机插入之后）(查找命中:插入)|关键接口|内存使用(字节)\n-------------|---------------------|--------------------------|-----------------|---------\n顺序查找(无序链表)|N:N |N/2:N| equals()|48N\n二分查找(有序数组)|lgN:N|lgN:N/2|compareTo()|16N\n二叉树查找(二叉查找树)|N:N|1.39lgN:1.39lgN|compareTo()|64N\n2-3树查找(红黑树)|2lgN:2lgN|1.00lgN:1.00lgN|compareTo()|64N\n拉链法(链表数组) |\u003clgN:\u003clgN|N/(2M):N/M |equals() hashCode()| 48N+32M\n线性探测法(并行数组)|clgN:clgN| \u003c1.5:\u003c2.5|equals() hashCode()| 在32N和128N之间\n\n# chapter04 图\n\n## 无向图\n* 4.1 [深度优先搜索(DFS)查找图中的路径](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DepthFirstPaths.java)\n* 4.2 [广度优先搜索(BFS)查找图中的路径](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/BreadthFirstPaths.java)\n* 4.3 [使用深度优先搜索找出图中的所有连通分量](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/CC.java)\n\n问题|解决方法\n-----|--------\n单点连通性|[DepthFirstSearch](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DepthFirstSearch.java)\n单点路径|[DepthFirstPaths](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DepthFirstPaths.java)\n单点最短路径|[BreadthFirstPaths](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/BreadthFirstPaths.java)\n连通性|[CC](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/CC.java)\n检测环|[Cycle](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Cycle.java)\n双色问题（图的二分性）|[TwoColor](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/TwoColor.java)\n\n\n## 有向图\n\n* 4.4 [有向图的可达性](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DirectedDFS.java)\n* 4.5 [拓扑排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Topological.java)\n* 4.6 [计算强连通分量的Kosaraju算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/KosarajuSharirSCC.java)\n\n问题|解决方案\n----|------\n单点和多点的可达性|[DirectedDFS](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DirectedDFS.java)\n单点有向路径|[DepthFirstDirectedPaths](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DepthFirstDirectedPaths.java)\n单点最短有向路径|[BreadthFirstDirectedPaths](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/BreadthFirstDirectedPaths.java)\n有向环检测|[DirectedCycle](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DirectedCycle.java)\n深度优先的顶点排序|[DepthFirstOrder](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DepthFirstOrder.java)\n优先级限制下的调度问题|[Topological](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Topological.java)\n拓扑排序|[Topological](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Topological.java)\n强连通性|[KosarajuSharirSCC](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/KosarajuSharirSCC.java)\n顶点对的可达性|[TransitiveClosure](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/TransitiveClosure.java)\n\n\n## 加权无向图\n\n* 4.7 最小生成树的Prim算法(贪心算法)\n    * [延时版本](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/LazyPrimMST.java)\n    * [即使版本](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/PrimMST.java)\n* 4.8 [最小生成树的Kruskal算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/KruskalMST.java)\n\n## 加权有向图\n\n* 4.9 [最短路径的Dijkstra算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DijkstraSP.java)\n* 4.10 [无环加权有向图的最短路径算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/AcyclicSP.java)\n* 4.11 [基于队列的Bellman-Ford算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/BellmanFordSP.java)\n\n算法|局限|路径长度的比较次数（增长的数量级）一般情况:最坏情况|所需空间|优势\n---|----|-------|----|-----\n[Dijkstra算法(即时版本)](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/DijkstraSP.java)|边的权重必须为正|ElogV:ElogV|V|最坏情况下仍有较好的性能\n[无环加权有向图的最短路径算法(拓扑排序)](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/AcyclicSP.java)|只适合用于无环加权有向图|E+V:E+V|V|是无环图中的最优算法\n[基于队列的Bellman-Ford算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/BellmanFordSP.java)|不能存在负权重环|E+V:VE|V|适用领域广泛\n\n# 字符串\n\n## 字符串排序\n\n* 5.1 [低位优先的字符串排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/LSD.java)\n* 5.2 [高位优先的字符串排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/MSD.java)\n* 5.3 [三向字符串快速排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Quick3string.java)\n\n算法|是否稳定|原地排序|在将基于大小为R的字母表的N个字符串排序的过程中调用charAt()方法次数的增长数量级（平均长度为w,最大长度为W）运行时间:额外空间|优势领域\n-----|------|------|------|------\n字符串的插入排序|是|是|N到N^2之间:1|小数组或者是已经有序的数组\n快速排序|否|是|Nlog2N:logN|通用排序算法，特别适合用于空间不足的情况\n归并排序|是|否|Nlog2N:N|稳定的通用排序算法\n三向快速排序|否|是|N到NlogN之间:logN|大量重复键\n[低位优先的字符串排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/LSD.java)|是|否|NW:N|较短的定长字符串\n[高位优先的字符串排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/MSD.java)|是|否|N到Nw之间:N+WR|随机字符串\n[三向字符串快速排序](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/Quick3string.java)|否|是|N到Nw之间:W+logN|通用排序算法，特别适合用于含有较长前缀的字符串\n\n## 单词查找树\n\n* 5.4 [基于单词查找树的符号表](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/TrieST.java)\n* 5.5 [基于三向单词查找树的符号表](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/TST.java)\n\n算法(数据结构)|处理由大小为R的字母表构造的N个字符串(平均长度为w)的增长数量级,未命中查找检查的字符数量:内存使用|优点\n-----|------|------\n二叉树查找(BST)|c1(lgN)^2:64N|适用于随机排列的键\n2-3树查找(红黑树)|c2lgN)^2:64N|有性能保证\n线性探测法(并行数组)|w:32N~128N|内置类型缓存散列值\n[字典树查找(R向单词查找树)](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/TrieST.java)|logRN:(8R+56)N~(8R+56)Nw|适用于较短的键和较小的字母表\n[字典树查找(三向单词查找树)](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/TST.java)|1.39lgN:64N~64Nw|适用于非随机的键\n\n## 子字符串查找\n\n* 5.6 [Knuth-Morris-Pratt字符串查找算法](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/KMP.java)\n* 5.7 [Boyer-Moore字符串匹配算法(启发式地处理不匹配的字符)](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/BoyerMoore.java)\n* 5.8 [Rabin-Karp指纹字符串查找算法（拉斯维加斯，书上是蒙特卡洛）](https://github.com/ejunjsh/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/RabinKarp.java)\n\n[![](https://raw.githubusercontent.com/ejunjsh/algs4/master/images/substring.jpg)](https://raw.githubusercontent.com/ejunjsh/algs4/master/images/substring.jpg)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fejunjsh%2Falgs4","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fejunjsh%2Falgs4","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fejunjsh%2Falgs4/lists"}