LC-77-组合
文章介绍了LeetCode第77题“组合”(难度为中等)的递归回溯解法,通过遍历、递归和回溯生成所有可能的k个数的组合,并提供了Golang代码实现,适合快速理解该算法的应用。
跳表-实现篇(Redis)
简介本文基于 Redis3.0 版本的源码解读跳表的实现 Redis3.0 源码链接:[redis/redis at 3.0.0](https://github.com/redis/redis/tree/3.0.0) 建议阅读: 跳表-原理篇 | Crayonの博客 本文按照以下顺序进行: 简介 背景知识 源码解读 结构体定义 随机函数 查找 插入 删除 背景知识Redis 内置了多种数据结构,其中`zset`(有序集合,英文名:sorted set)兼具集合的元素唯一性以及有序性(元素有序性)两个特性,被广泛用在日常业务需求的开发中 zset由多个数据结构组合实现的,而跳表(zskiplist)就是实现有序性的关键数据结构,Redis 就是通过跳表实现了zset结构的排序、根据排名的范围获取等操作 Redis 自己实现了跳表结构,为符合自身业务操作的需要增加了一些额外的字段以及操作,虽然和原始论文中的结构不太一样,但基本的操作逻辑都是相同的 源码解读结构体定义zset1234typedef struct zset { dict *dict; ...
跳表-实现篇(Golang)
简介本文将参照论文使用Golang语言实现跳表 建议阅读:跳表-原理篇 | Crayonの博客 本文按照以下顺序进行: 简介 编码实现 结构体定义 随机函数 查找 插入 删除 代码测试 性能对比 数据量1k 数据量1w 数据量10w Leetcode 编码实现本次实现和论文一样,节点顺序以升序排序 结构体定义12345678910111213141516type ( Node struct { Key float64 Value interface{} Forwards []*Node } SkipList struct { Head *Node Level int // MaxLevel 跳表的最大层级,这样可以很方便的实现不同最高层级的跳表 MaxLevel int // P 层级上升的概率 P float64 }) 随机函数和论文如出一辙,这里使用了golang的rand包来生成随机数 1234567func (s *SkipList) randomLevel() int { level :=...
跳表-原理篇
什么是跳表跳表(也可以叫跳跃表,英文名:Skip List)是由William Pugh发明的一种查找数据结构,支持对数据的快速查找、插入和删除 OI Wiki:跳表 - OI Wiki 论文地址:skiplists 论文开篇就说明了这是一种可以用来代替平衡树的数据结构(平衡树的实现实在是太复杂了😩) 与平衡树相比,跳表的插入和删除算法要简单得多 BST存在的问题 Binary trees can be used for representing abstract data types such as dictionaries and ordered lists. They work well when the elements are inserted in a random order. Some sequences of operations, such as inserting the elements in order, produce degenerate data structures that give very poor performance. If...
Golang-数组与切片
Go 中的数组和分片都是顺序数据结构,但有一些关键的区别:数组是固定长度的,由存储的元素类型和大小定义;而分片可以理解为动态数组,与类型和长度无关。切片有一个结构,包含长度、容量和指向底层数组的指针,可以同时被多个切片引用。生成切片时,结果的容量是从数组的起点到终点。切片支持特殊方法,如在某些条件下扩展长度和容量。当切片用作函数参数时,函数内部的更改会因底层数组而生效。不过,分片没有并发控制,在并发环境中可能不安全。
Redis-字典
Redis中的字典被广泛用于实现Redis的各种功能,其中包括数据库和哈希键。字典会根据负载情况自动进行扩容和收缩,而和其他语言哈希表的扩缩容不同的是,Redis采用渐进式操作的方式实现,以保证扩缩容期间服务的性能稳定
Redis-简单动态字符串(SDS)
Redis只会使用C字符串作为字面量,在大多数情况下,Redis使用SDS(Simple Dynamic String,简单动态字符串)作为字符串表示。相比于C字符串,SDS提供了更好的性能和安全性。
Golang-逃逸分析
逃逸分析是 Go 语言中的一种编译器优化技术,用于确定变量应在堆栈还是堆上分配。它是静态代码分析后的一个优化步骤,用于改善内存管理和提高程序速度。如果函数外没有引用,变量会优先被放置在堆栈中,因为堆栈比堆栈更快,但空间有限。如果函数外有引用,由于存在悬空指针的风险,变量必须放在堆上。逃逸分析可以将变量直接分配到堆,从而减少堆内存分配和 GC 压力。通过使用特定标志编译或检查汇编代码,可以查看转义分析的结果。常见的转义情况包括指针转义、堆栈空间不足以及引用对象的闭包。逃逸分析有助于正确分配内存,从而提高效率和性能。