数据结构与算法
学习建议 掌握基础:从数组、链表、栈、队列等基础数据结构开始,逐步深入到树、图、哈希表等复杂结构。掌握排序、搜索、递归、动态规划等基本算法。 实践为主:多刷题,使用平台如 LeetCode、Codeforces 等锻炼思维。理解常用算法的实际应用场景。 关注效率:分析算法的时间和空间复杂度,学会取舍。 系统学习:阅读经典教材如《算法导论》、《编程珠玑》等,夯实理论基础。 ...
学习建议 掌握基础:从数组、链表、栈、队列等基础数据结构开始,逐步深入到树、图、哈希表等复杂结构。掌握排序、搜索、递归、动态规划等基本算法。 实践为主:多刷题,使用平台如 LeetCode、Codeforces 等锻炼思维。理解常用算法的实际应用场景。 关注效率:分析算法的时间和空间复杂度,学会取舍。 系统学习:阅读经典教材如《算法导论》、《编程珠玑》等,夯实理论基础。 ...
platodb 介绍 platodb 是一款基于 LSM-Tree 存储结构的高性能分布式 key-value 数据库,采用 go 语言编写,支持快速的读写性能、崩溃恢复和主-从集群架构。适用于高吞吐量和低延迟需求的存储场景。 github 仓库:https://github.com/Jasonbourne723/platodb Quick start 基于 Docker 快速安装 ...
并查集 并查集(Disjoint-set)是一种数据结构,用于处理一些不交集的合并及查询问题。并查集支持如下操作: 查询:查询某个元素属于哪个集合,通常是返回集合内的一个“代表元素”。这个操作是为了判断两个元素是否在同一个集合之中。 合并:将两个集合合并为一个。 添加:添加一个新集合,其中有一个新元素。添加操作不如查询和合并操作重要,常常被忽略。 由于支持查询和合并这两...
位图(Bitmap) 是一种数据结构,使用位(bit)来标记值的存在或状态。每个元素的状态由一个位表示(0或1),从而可以高效地进行存储和操作。位图常用于需要快速判断某个值是否存在或需要节省存储空间的场景。 位图的优点 节省空间:位图通过使用位(而不是字节或更大的数据类型)表示数据,占用的存储空间非常小。例如,一个32位整数可以表示32个状态(0或1),而不是仅表示一个数值。 ...
基本概念 音视频采集基本概念 摄像头。用于捕捉(采集)图像和视频。 帧率。现在的摄像头功能已非常强大,一般情况下,一秒钟可以采集 30 张以上的图像,一些好的摄像头甚至可以采集 100 张以上。我们把摄像头一秒钟采集图像的次数称为帧率。帧率越高,视频就越平滑流畅。然而,在直播系统中一般不会设置太高的帧率,因为帧率越高,占的网络带宽就越多。 分辨率。摄像头除了可以设置帧率之外...
二叉查找树 type BinaryTree struct { root *Node } type Node struct { item int count int left *Node right *Node } func NewBinaryTree() *BinaryTree { tree := new(BinaryTree) return tree } 插入操作...
垃圾回收 (Garbage Collection,简称 GC) 是编程语言中提供的自动的内存管理机制,自动释放不需要的内存对象,让出存储器资源。GC 过程中无需程序员手动执行。GC 机制在现代很多编程语言都支持,GC 能力的性能与优劣也是不同语言之间对比度指标之一。 Golang 在 GC 的演进过程中也经历了很多次变革, Go V1.3 之前的标记-清除算法 Go V...
寻找一种易于理解的一致性算法(扩展版) 寻找一种易于理解的一致性算法(扩展版) 摘要 1 介绍 2 复制状态机 3 Paxos 算法的问题 4 为了可理解性的设计 5 Raft 一致性算法 5.1 Raft 基础 5.2 领导人选举 ...
1. 插入排序 每次循环迭代都保证一个已排序前缀 时间复杂度 最优:O(n), 最差:O(n^2) 平均:O(n^2) func InsertSort(array []int) []int { for i := 0; i < len(array); i++ { j := i for j > 0 && array[j] < a...
定义 限流是指在单位时间内限制接口的请求数量。其主要作用有两个: 保护服务的处理能力:避免因流量洪峰导致系统超载或崩溃。 防范恶意调用:防止人为或恶意的频繁请求耗尽系统资源。 限流位置 客户端:在客户端或前端直接限制用户的请求频率。例如,用户提交表单时设置按钮的防重复点击,或通过前端代码限制调用频次。这样可以有效降低无意义的请求传递到后端。 ...
Kafka 介绍 Apache Kafka 是一个开源的分布式事件流处理平台,最初由 LinkedIn 开发,并在 2011 年开源,现由 Apache 软件基金会维护。Kafka 的设计目标是 高吞吐量、低延迟、可扩展、高可用性,适用于实时数据流处理和大规模数据集成。 Kafka相比于传统的消息中间件有三个角色: 消息系统:Kafka 是高性能的消息队列,单机吞吐量可到达百万级...
日志无处不在:系统的基础 日志结构在许多关键系统中起着基础性的作用: 关系数据库:数据库首先写入预写日志(WAL),以确保事务的原子性和持久性。即便数据库崩溃,所有表的数据也可以从 WAL 中重建。 文件系统:如 XFS 文件系统,先将文件元数据的更改写入日志,然后再写入文件本身,以保证一致性。 分布式系统:Raft、ZAB、Paxos 等状态机复制协议依赖日志,确保所有副...
RabbitMQ是目前非常热门的一款消息中间件,其凭借高可靠、易扩展、高可用及丰富的功能特性受到众多开发者的青睐,在互联网、金融传统行业中都在大量的使用。 消息中间件 什么是消息中间件 消息中间件,也称消息队列,是一种在分布式系统中用于消息通信、传输和处理的软件,它提供了异步通信的机制,解耦了系统中的不同服务或组件,使它们能够以松耦合的方式进行交互。 它一般有两种传递模式:点...
main: 具有无限生存期的主要分支,用于存放稳定的、可发布的代码。 dev: 作为主开发分支,所有的功能分支都会从这里拉取,并在开发完成后合并回这个分支。 feature: 每开始一个新功能都要从dev分支拉取一个新的功能分支。命名为 feature-*。完成后合并回 dev 分支。功能分支通常仅存在于开发人员存储库中,而不存在于origin 中。功能完成后,可以直接删除...
设计一个拥有上百万用户的系统是很有挑战性的,这将是一个不断优化、持续改进的过程。在本章中,我们先创建一个单用户的系统,然后逐渐将其扩展成可以服务上百万用户的系统。读完本文,你将掌握几个能帮助你破解系统设计面试难题的技巧。 单服务器配置 万里征途总是从第一步开始的,构建一个复杂系统也是如此。我们从简单的部分着手,先让所有的功能都在一个服务器上运行。图1-1展示了如何配置单台服务器,让一切都...