
数据结构和算法
文章平均质量分 70
思维的深度
这个作者很懒,什么都没留下…
展开
-
贪心算法
贪心算法也称贪婪算法,其核心思想就是:每步都采用最优的做法。 贪心算法所得到的结果往往不是最优的结果(有时候是最优解),但都是相对接近最优解的。 使用贪心算法的前提条件是策略的选择必须具备无后效性。 无后效性就是某个状态一旦确定,其之后的决策不再受之前决策的影响。详细理解可参考:https://skaygo.blog.youkuaiyun.com/article/details/115873380 示例:以下示例摘自《图解算法》...原创 2021-04-19 20:20:01 · 203 阅读 · 0 评论 -
有后效性和无后效性的通俗理解
无后效性是动态规划算法及贪心算法的前提条件无后效性:某阶段的状态一旦确定,则此后过程的决策不再受此前各种状态及决策的影响。有后效性:就是某个状态之后要做的决策会受之前的状态及决策的影响。举例:如下图有四乘四的网格,要从左上角走的右下角,条件是每次只能向下或向右走。如下图从起点走到黑色圆圈位置S(2,2)有两种方案,但是S(2,2)接下来所做的决策不用考虑之前的决策,故是无后效性。如果把条件改为:可以往前后左右走但是不能走重复的格子,那么接下来要做的决策就需要考虑之前的决策,故此时是.原创 2021-04-19 20:18:07 · 9471 阅读 · 0 评论 -
golang实现CRC8算法
CRC校验算法,就是把需要校验的数据与多项式进行循环异或(XOR),但进行异或的方式与实际中数据传输时,是高位先传、还是低位先传有关。对于数据高位先传的方式,异或从数据的高位开始,我们暂且称它顺序异或;对于数据低位先传的方式,异或从数据的低位开始,我们就叫它反序异或。本文基于表达式x^8+x^5+x^4+x^0一、顺序异或1.通过计算获取crc8//x^8+x^5+x^4+x^0func getcrc8High(buf []byte) (crc byte) { for i ...原创 2020-12-23 18:06:50 · 1384 阅读 · 0 评论 -
golang实现一致性哈希算法
package mainimport ( "crypto/sha1" "sync" "math" "sort" "strconv" "fmt")const ( node1 = "192.168.1.1" node2 = "192.168.1.2" node3 = "192.168.1.3")const ( //DefaultVirualSpots default virual spots DefaultVirualSpots = 400)//节点信息typ.原创 2020-12-12 15:03:14 · 780 阅读 · 0 评论 -
图解一致性哈希算法的基本原理
一致性哈希的基本原理一致性哈希算法是将每个Node节点映射到同一个圆上。将各Node的key采用hash计算,可得到一个整数数组。将该数组排序后,首尾相连即是一个圆。如下图所示简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下:整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到2^32-1,也就是说0点左侧..原创 2020-12-12 14:48:05 · 1316 阅读 · 0 评论 -
Golang 使用递归实例
递归是一种分而治之的思想,每个递归函数都有两个条件 基线条件和递归条件递归条件指的是函数调用自己,而基线条件则是函数不再调用自己,从而避免形成无线循环示例:package mainimport "fmt"func main() { fmt.Println("sum:",doSum([]int{2,4,6})) fmt.Println("len:",checkLength([]int{2,4,6})) var max int checkMax([]int{2,6,4},&.原创 2020-10-28 12:05:09 · 576 阅读 · 0 评论 -
etcd中raft算法实现原理
摘要Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如领导人选举、日志复制和安全性。同时它通过实施一个更强的一致性来减少需要考虑的状态的数量。从一个用户研究的结果可以证明,对于学生而言,Raf...转载 2018-07-12 17:28:01 · 5069 阅读 · 0 评论 -
Golang中Rabin-Karp算法
Go 语言的 strings 包(strings.go)中用到了 Rabin-Karp 算法。Rabin-Karp 算法是基于这样的思路:即把字符串看作是字符集长度进制的数,由数值的比较结果得出字符串的比较结果。 朴素的字符串匹配算法为什么慢?因为它太健忘了,前一次匹配的信息其实有部分可以应用到后一次匹配中去,而朴素的字符串匹配算法只是简单的把这个信息扔掉,从头再来,因此,浪费了时间。好好的利用...转载 2018-05-29 19:02:27 · 701 阅读 · 0 评论 -
golang实现单例模式
package mainimport ( "sync" "fmt")type singleton map[string]stringvar ( once sync.Once instance singleton)func New() singleton { once.Do(func() { instance = make(singleton) }) retur...原创 2018-05-10 18:58:15 · 2255 阅读 · 0 评论 -
golang实现AVL树
AVL树是带有平衡条件的二叉查找树特点:AVL树中每个节点的左子树和右子树的高度最多差1 旋转:由于插入操作可能会破坏AVL树的平衡特性,故在插入完成之前通过对树进行简单修正来恢复平衡示例代码如下:package mainimport ( "fmt")type avlTreeNode struct { key int high int原创 2018-02-06 13:42:11 · 1168 阅读 · 0 评论 -
golang实现二叉查找树
二叉树:每个节点至多有两个子节点二叉查找树的特点:对于每一个节点X,左子树中所有项的值小于X中的值,而它的右子树种所有项的值大于X中的值。二叉查找树是特殊的二叉树以下用代码实现type binarySearchTree struct { value int left,right *binarySearchTree}//初始化并添加根节点的值f原创 2018-02-02 19:03:21 · 1242 阅读 · 3 评论 -
golang实现队列操作
队列和栈一样也是表。然而队列是插入在一段进行而删除在另一端进行。队列是先进先出(FIFO)的。下面用切片实现队列操作:package mainimport "fmt"type Element interface{}type Queue interface { Offer(e Element) //向队列中添加元素 Poll() Element /原创 2018-02-01 18:13:41 · 7749 阅读 · 0 评论 -
golang实现栈操作
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶。栈有时又叫LIFO(先进后出)表。对栈的操作有Push(进栈)和Pop(出栈),前者相当于插入,后者相当于删除最后插入的元素。以下用双向链表和切片实现分别实现栈操作//stack//用双向链表实现stacktype Element interface {}var header *entry原创 2018-02-01 18:05:30 · 2432 阅读 · 0 评论 -
golang实现双链表
package mainimport ( "fmt" "time")type Element interface {}var header *entry //链表表头var size int //链表长度type entry struct { previous *entry next *entry element Element}func ne原创 2018-01-31 18:54:58 · 737 阅读 · 0 评论 -
golang实现单链表
package main//链表实现import ( "fmt")//定义元素类型type Element interface {}//定义节点type linkNode struct { Data Element //数据域 Nest *linkNode //指针域,指向下一个节点}func NewLinkNode() *linkNode{ return原创 2018-01-31 18:53:35 · 1906 阅读 · 0 评论 -
一致性哈希原理及特点
一致性哈希常用于分布式缓存中,本文主要介绍一致性哈希算法的原理及特点1)一致性哈希算法原理一致性哈希算法是将每个Node节点映射到同一个圆上。将各Node的key采用hash计算,可得到一个整数数组。将该数组排序后,首尾相连即是一个圆。如下图所示,Node的key分布在圆的不同弧段上。同理,若有一请求key,hash后落入该圆的某一弧段(下图三角点所示),顺时针方向寻得离其最近的节点即原创 2018-01-23 18:44:48 · 1756 阅读 · 0 评论 -
golang实现一致性哈希算法
import ( "errors" "hash/crc32" "sort" "strconv" "sync")type uints []uint32// Len returns the length of the uints array.func (x uints) Len() int { return len(x) }// Less returns true if el原创 2018-01-23 18:12:43 · 1571 阅读 · 0 评论 -
递归算法(golang代码实现)
当一个函数用它自己来定义时就称为是递归的 例:f(0)=0且f(x) = 2*f(x-1)+x*x递归说白了,就是函数自己会调用自己以下用golang实现简单的递归方法func main() { fmt.Println("结果:",test(105)) fmt.Println("递归次数:",c)}var c intfunc test(i int) int { if i =原创 2018-01-30 18:25:16 · 1573 阅读 · 0 评论