首页
学习
活动
专区
工具
TVP
发布

labuladong的算法专栏

专栏作者
166
文章
93668
阅读量
30
订阅数
球盒模型:一切回溯穷举,皆从此法出
阅读本文之前,需要你熟悉 回溯算法核心框架 以及 回溯算法秒杀排列/组合/子集问题。
labuladong
2024-04-10
590
终于上线了,速来!
之前发布了算法可视化面板之后,有很多读者希望能够在可视化面板运行自己的代码。最近给我的算法学习网站自建了后端服务,可视化面板添加了编辑器功能,可以输入自定义代码了,可视化面板地址:
labuladong
2024-01-08
1230
我带着 chatGPT 做了 2800 道算法题🤣
老读者都知道,以前我的算法教程主要使用 Java 语言。但是现在有了 chatGPT 的帮助,《labuladong 的刷题全家桶》已经全面支持了 Java/C++/Python/Golang/JavaScript 等所有所有主流编程语言,能尽可能照顾到更多读者的需求。
labuladong
2023-10-08
4450
用 chatGPT 提高效率的套路总结
最近这段时间 chatGPT 掀起了一阵 AI 热潮,目前来看网上大部分内容都是在调戏 AI,很少有人写如何用 chatGPT 做正事儿。 我作为一个大部分知识都是从搜索引擎和 GitHub 学来的程序员,第一次和 chatGPT 促膝长谈后,基本认定了一个事实:chatGPT 一定能大幅增加程序员学习新技术的效率。 目前我已经深度使用 chatGPT 一个月了,越来越能感受到这个工具的颠覆性。所以这篇文章不探讨 chatGPT 的沙雕玩法,单从工作和学习的视角,分享下 chatGPT 的牛逼之处以及我使用 chatGPT 的一些经验技巧。 如何借助 chatGPT 学习新技术 经过这些年对于各类知识的学习,我先阐述一个个人的总结:学习一个新知识/新技术,其实就是在脑海中构建这个技术的「知识模型」。所谓小白和专家的区别,其实就是脑海中这个知识模型精细程度的区别。 举个简单的例子,就比如计算机网络吧,如果电脑上不了网了,怎么办? 普通用户能做的,可能就是重启下电脑和路由器,确认一下是否是宽带欠费了;那作为程序员,多少了解一些基本的网络知识,就可以使用一些常用命令查看一下网关、DNS 之类的,或者抓个包看看到底是哪里出了问题;对于专业的网络工程师,那肯定有更多定位和解决问题的办法,这里我也不懂,编不来。 同是计算机网络,以上几个角色的根本区别在于对网络这个东西的理解深度不同,或者说他们脑子里对于「计算机网络」这个知识模型的精度不同。 普通用户脑子中对网络的认知,恐怕就是一个 WiFi 图标,普通程序员脑子中对网络的认知模型,可以细化到几层协议栈和一个个数据包,网络工程师脑子中对网络的认知模型,也许可以进一步细化到每个数据包中的每一个比特位。 那么现在我想对一个新技术建立知识模型,我应该怎么做呢? 就比如 k8s 这一套技术吧,我作为初学者最开始接触 k8s 的时候会被里面的很多名词绕晕,比如 CRD, CR, controller, operator 这些都是什么鬼?它们之间是如何作用的?既然 k8s 里面的资源都是 API Object,那 k8s 更像是个数据库,和容器编排和调度又是怎么扯上关系的? 我猜 k8s 的初学者可能也有类似的问题,但去搜索引擎上一般是搜不到让人满意的答案的。 因为搜索引擎的特点是:你必须明确地知道自己要什么,这样才能给出准确的搜索关键词,搜索引擎才能帮你找到你需要的信息。 类比前文说的「知识模型」的概念,搜索引擎擅长的,是给出这个模型的一个切面的所有信息。比如你遇到了一个 bug,把报错信息贴上去搜一下,大概率可以找到这个 bug 的成因以及解决方法。 但现在的问题是我作为初学者,对 k8s 里面的很多概念理解都不准确,按照我已知的信息进行推理,k8s 应该是一个数据库才对,但事实与我的推理并不相符,那么我哪里理解错了?正确的理解方式是什么? 对于我的这些问题,搜索引擎无法回答,毕竟搜索引擎能做的只是索引已有的数据,即便以前有人也问过类似的问题,但往往没有官网文档和技术社区的权重高,很可能被淹没在互联网的海洋中,难以被找到。 这就是传统搜索引擎的一大痛点:无法直接回答类似「对不对」「哪里出错了」这类问题。 所以在过去,我学习新技术的过程其实就是借助搜索引擎收集知识碎片,然后在脑海里整理这些碎片形成一个完整的知识模型,并不断在实践中完善和修正这个模型。 当然,一个最高效的办法就是抱大腿,找一个这方面比较有经验的大佬,把我自己想不通的地方清楚地表述出来,那么对方可能随手画个图外加三两句话就能把整个逻辑理清楚,让我豁然开朗。 不过万一找不到大佬怎么办呢?换做以前,恐怕只能继续硬着头皮找资料看代码,效率比较低。而现在,chatGPT 就可以扮演一个技术巨佬的角色,7x24 小时提供问答服务。 chatGPT 可以理解聊天上下文,所以我经常会对 chatGPT 的解答中的一部分细节发起质疑,进行更深入的探讨,它完全能理解我的意思,几乎都能给出准确的答案解决我的疑惑。 那么经过这么长时间的深度体验,我可以说 chatGPT 是传统搜索引擎的强力外援,怪不得微软 bing 整合 chatGPT 会让各个搜索大厂那么紧张呢。不过神仙们打架咱也不配掺和,接下来分享一些我使用 chatGPT 的一些技巧。 chatGPT 使用技巧 如果想让搜索引擎返回准确的结果,需要一定的技巧来构建关键词。如果想最大化发挥 chatGPT 的能力作为搜索引擎的补充,也需要一些小技巧。 1️⃣ 尽量使用英文和 chatGPT 交流。 我们这篇文章主要是探讨利用 chatGPT 学习新技术嘛,那么不可否认一手的技术文档还是英文居多,所以 chatGPT 学习的相关数据肯定也相对较多,更有利于得到准确详尽的答案。 另外,中文的文本生成相比英文的文本生成要复杂,所以中文交流的响应速度会明显慢于英文交流。 2️⃣ 多用反问的方式和 ch
labuladong
2023-10-08
2520
更进一步!可视化一切递归算法!
其中最重要的一个更新是支持了递归算法的可视化,而且可视化的方式可以说是我之前系列文章所阐述的算法思想的的具体实现,我真的动手把抽象的思想给展示出来了,绝对可以帮助你更好的理解算法的本质!
labuladong
2023-09-03
1950
必知必会位运算技巧手册
位操作(Bit Manipulation)可以有很多技巧,有一个叫做 Bit Twiddling Hacks 的网站收集了几乎所有位操作的黑科技玩法,网址如下: http://graphics.stanford.edu/~seander/bithacks.html 但是这些技巧大部分都过于晦涩,我觉得可以作为字典查阅,没必要逐条深究。但我认为那些有趣的、有用的位运算技巧,是我们每个人需要掌握的。 所以本文由浅入深,先展示几个有趣(但没卵用)的位运算技巧,然后再汇总几个在算法题以及工程开发中常用的位运算技巧。 几个有趣的位操作
labuladong
2023-03-02
2550
一致性哈希算法设计题,栽了
最近有一位读者跟我交流,说除了算法题之外,系统设计题是一大痛点。算法题起码有很多刷题平台可以动手实践,但系统设计类的题目一般很难实践,所以看一些教程总结也只是一知半解,遇到让写代码实现系统的就懵了。
labuladong
2023-03-02
2300
《玩游戏,学技术》第二篇,用消息队列实现所有游戏功能
书接前文,《玩游戏,学技术》第一讲:需求分析 提出了最关键的一个设计,即每个游戏客户端包含一个 Pulsar 生产者和一个 Pulsar 消费者:
labuladong
2023-03-02
5070
《玩游戏,学技术》第一讲:画饼
我之前写过一篇文章 我用消息队列做了个联机游戏 用 Pulsar 这款消息队列实现了一个比较简陋的炸弹人游戏
labuladong
2023-03-02
3770
Union Find 并查集算法原理及应用
记得我之前在讲 图论算法基础 时说图论相关的算法不会经常考,但最近被打脸了,因为一些读者和我反馈近期求职面试涉及很多图论相关的算法,可能是因为环境不好所以算法这块更卷了吧。
labuladong
2022-12-10
5370
如何学习开源项目,我又总结了套路
在线学习网站: https://labuladong.github.io/algo/
labuladong
2022-12-10
5300
CRUD 一年多,我的破局思路
在线学习网站: https://labuladong.github.io/algo/
labuladong
2022-12-10
3900
用算法打败算法
经常有读者问我学算法有什么用,我觉得算法是一种抽象的思维能力。现实中的很多问题只要稍加抽象,就能联想到算法题中的编程技巧,然后得心应手地解决它们。
labuladong
2022-12-10
3270
我用消息队列做了一款联机小游戏
上篇文章 我讲了两种常用的随机算法,本文就把这些算法运用出来,做一个多人在线小游戏。
labuladong
2022-12-10
9820
说透游戏中常用的两种随机算法
读完本文,可以去力扣解决如下题目: 382. 链表随机节点(中等) 398. 随机数索引(中等) 384. 打乱数组(中等)
labuladong
2022-12-10
6380
存储系统中的算法:LSM 树设计原理
我在上篇文章 Apache Pulsar 的架构设计 中介绍了 Pulsar 存算分离的架构,其中 broker 只负责计算,由 BookKeeper 负责底层的存储,我还画了这样一张图说明 BookKeeper 读写分离的设计:
labuladong
2022-12-10
4670
面试官让我重构 Kafka,懵了……
经常有读者后台跟我说,希望我能够写一些系统设计相关的文章,最近我就在研究常用消息队列 kafka 和 pulsar 的架构设计,所以总结了这篇文章,希望在你做技术选型或阅读源码的时候起到一定的帮助。
labuladong
2022-12-10
3440
微软面试题解析:丑数系列算法
最近读者群里有个读者跟我私信,说去面试微软遇到了一系列和数学相关的算法题,直接懵圈了。我看了下题目,发现这些题其实就是 LeetCode 上面「丑数」系列问题的修改版。
labuladong
2022-12-10
5470
别用 KMP 了, Rabin-Karp 算法了解下?
经常有读者留言,请我讲讲那些比较经典的算法,我觉得有这个必要,主要有以下原因: 1、经典算法之所以经典,一定是因为有独特新颖的设计思想,那当然要带大家学习一波。 2、我会尽量从最简单、最基本的算法切入,带你亲手推导出来这些经典算法的设计思想,自然流畅地写出最终解法。一方面消除大多数人对算法的恐惧,另一方面可以避免很多人对算法死记硬背的错误习惯。 我之前用状态机的思路讲解了 KMP 算法,说实话 KMP 算法确实不太好理解。不过今天我来讲一讲字符串匹配的另一种经典算法:Rabin-Karp 算法,这是一个很简单优雅的算法。 本文会由浅入深地讲明白这个算法的核心思路,先从最简单的字符串转数字讲起,然后研究一道力扣题目,到最后你就会发现 Rabin-Karp 算法使用的就是滑动窗口技巧,直接套前文讲的 滑动窗口算法框架 就出来了,根本不用死记硬背。 废话不多说了,直接上干货。 首先,我问你一个很基础的问题,给你输入一个字符串形式的正整数,如何把它转化成数字的形式?很简单,下面这段代码就可以做到: string s = "8264"; int number = ; for (int i = ; i < s.size(); i++) { // 将字符转化成数字 number = * number + (s[i] - '0'); print(number); } // 打印输出: // 8 // 82 // 826 // 8264 可以看到这个算法的核心思路就是不断向最低位(个位)添加数字,同时把前面的数字整体左移一位(乘以 10)。 为什么是乘以 10?因为我们默认探讨的是十进制数。这和我们操作二进制数的时候是一个道理,左移一位就是把二进制数乘以 2,右移一位就是除以 2。 上面这个场景是不断给数字添加最低位,那如果我想删除数字的最高位,怎么做呢?比如说我想把 8264 变成 264,应该如何运算?其实也很简单,让 8264 减去 8000 就得到 264 了。 这个 8000 是怎么来的?是 8 x 10^3 算出来的。8 是最高位的数字,10 是因为我们这里是十进制数,3 是因为 8264 去掉最高位后还剩三位数。 上述内容主要探讨了如何在数字的最低位添加数字以及如何删除数字的最高位,用R表示数字的进制数,用L表示数字的位数,就可以总结出如下公式: /* 在最低位添加一个数字 */ int number = ; // number 的进制 int R = ; // 想在 number 的最低位添加的数字 int appendVal = ; // 运算,在最低位添加一位 number = R * number + appendVal; // 此时 number = 82643 /* 在最高位删除一个数字 */ int number = ; // number 的进制 int R = ; // number 最高位的数字 int removeVal = ; // 此时 number 的位数 int L = ; // 运算,删除最高位数字 number = number - removeVal * R^(L-); // 此时 number = 264 如果你能理解这两个公式,那么 Rabin-Karp 算法就没有任何难度,算法就是这样,再高大上的技巧,都是在最简单最基本的原理之上构建的。不过在讲 Rabin-Karp 算法之前,我们先来看一道简单的力扣题目。 高效寻找重复子序列 看下力扣第 187 题「重复的 DNA 序列」,我简单描述下题目: DNA 序列由四种碱基A, G, C, T组成,现在给你输入一个只包含A, G, C, T四种字符的字符串s代表一个 DNA 序列,请你在s中找出所有重复出现的长度为 10 的子字符串。 比如下面的测试用例: 输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC","CCCCCAAAAA"] 解释:子串 "AAAAACCCCC" 和 "CCCCCAAAAA" 都重复出现了两次。 输入:s = "AAAAAAAAAAAAA" 输出:["AAAAAAAAAA"] 函数签名如下: List<String> findRepeatedDnaSequences(String s); 这道题的拍脑袋解法比较简单粗暴,我直接穷举所有长度为 10 的子串,然后借助哈希集合寻找那些重复的子串就行了,代码如下: // 暴力解法 List<String> findRepeatedDnaSequences(String s) { int n = s.length(); // 记录出现过的子串 HashSet<String> seen = new HashSet(); // 记录那些重复出现多次的子串 // 注
labuladong
2022-12-08
7350
高频面试系列:单词拆分问题
读完本文,可以去力扣解决如下题目: 139. 单词拆分(中等) 140. 单词拆分II(困难)
labuladong
2022-09-01
4780
点击加载更多
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档