![](https://img-blog.csdnimg.cn/20210101171647274.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 86
主要内容按照labuladong的算法小抄,代码全部使用Go进行实现
、Edgar
Coding with fun
展开
-
八大排序算法及其Go代码实现
1.选择排序原理每次选择数组中的最小元素,排在第一个位置算法步骤[38,65,97,76,13,27,49]13 [65 97 76 38 27 49]13 27 [97 76 38 65 49]13 27 38 [76 97 65 49]13 27 38 49 [97 65 76]13 27 38 49 65 [97 76]13 27 38 49 65 76 [97]13 27 38 49 65 76 97代码实现func SelectSort(data []int) { l原创 2021-11-29 18:00:14 · 412 阅读 · 0 评论 -
分布式 ID 生成器
背景假设我们有一个分布式系统,系统中需要维护全局 id 字段,我们可以把它认为是唯一的标识,不能够重复出现,那么问题来了,我们应该如何生成这样的 id 呢?其实很容易想到的一种解决方式就是使用 Redis 的键值对了,每次更新的时候直接调用 incr,生成的 id 也是唯一的,还有一种方式就是使用 MySQL 或者其他的数据库,因为我们知道 MySQL 中可以生成自增主键,使用这个主键作为一个分布式 id 也是可行的。但是上面的这两种方式效率不会特别高,并且依赖于第三方,我们如果想要更高效的生成分布式原创 2021-11-24 16:40:50 · 448 阅读 · 0 评论 -
一致性哈希算法原理及代码实现
一致性哈希安装go get -u github.com/junhaideng/consistent使用c := consistent.New()ips := []string{"192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4"}for _, ip := range ips { c.Add(ip)}fmt.Println("ip: ", c.Get("/hello.txt"))背景在介绍一致性哈希之前,首先来看原创 2021-11-10 21:43:17 · 1039 阅读 · 0 评论 -
第一章--核心套路篇 之 滑动窗口算法框架
滑动窗口算法的主要代码框架如下// s 是所给的字符串或者其他数组// t 是目标值func slidingWindow(s, t string) { need := make(map[byte]int) window := make(map[byte]int) for i:=0;i<len(t);i++{ need[t[i]] ++ } left, right := 0, 0 valid := 0 // s不一定是字符串,还可以是其他类型的数组 // 如果右指针还没原创 2021-01-24 20:15:15 · 253 阅读 · 0 评论 -
第一章--核心套路篇 之 双指针技巧框架
双指针可以分成两类,一类是快慢指针,一类是左右指针,前者主要解决链表中的问题,比如典型的是判定链表中是否存在环;后者主要是解决数组或者字符串中的问题,比如二分搜索快慢指针的常见算法1.判定链表中是否存在环判断一个链表是否存在环的一个直接了当的方式就是设置一个map表,不断访问链表,如果访问的元素出现了重复,那么链表中便存在环,否则如果访问到了null,便不存在环,伪代码如下:type Node struct{ Data interface{} Next *Node}func hasCy原创 2021-01-24 11:47:29 · 198 阅读 · 0 评论 -
第一章--核心套路篇 之 BFS算法套路框架
BFS算法套路框架BFS(Breath First Search)和DFS(Depth First Search) 是两种十分常用的算法,其中DFS算法可以认为是回溯算法BFS算法和核心就是将问题抽象成图,从一点开始进行扩散,一般来说写BFS的时候均使用队列,每次将一个结点周围的所有结点加入到队列中BFS相对于DFS的主要区别是:BFS找到的路径一定是最短的,但代价是空间复杂度比DFS高算法框架func BFS(start Node, target Node) { // 假设Queue是已经实原创 2021-01-22 20:47:42 · 317 阅读 · 0 评论 -
第一章--核心套路篇 之 回溯算法解题套路框架
解决一个回溯问题,实际上就是一个决策树的遍历过程,需要考虑下面的三个要素:路径:已经做出的选择选择列表:当前可以做出的选择结束条件:达到决策树底层,无法做出选择的条件代码框架如下:var result []路径 // 保存结果的数组func backtrack(路径,选择列表){ if 满足结束条件{ 加入到result中 return } for _, 选择 := range 选择列表{ // 做出选择 路径 = append(路径, 选择)原创 2021-01-22 20:39:14 · 196 阅读 · 0 评论 -
第一章--核心套路篇 之 动态规划解题套路框架
首先动态规划问题的一般形式就是求最值,动态规划其实是运筹学中的一种最优化方法,只不过在计算机中的应用比较多,比如求最长递增子序列,最小编辑距离等既然是求解最值,核心问题就是穷举,因为要求最值,肯定要把所有可行的解全部穷举出来,然后在其中寻找最值,遇到最值问题,就要思考如何穷举所有可能结果。动态规划的穷举与一般的穷举有所不同,因为这类问题存在重叠子问题,如果暴力穷举,效率极其低下,所以需要使用备忘录或者dp table来优化穷举过程,避免不必要的计算动态规划类问题一定会具有最优子结构,这样才能通过子原创 2021-01-22 10:54:05 · 176 阅读 · 0 评论