0、开篇词:真实世界的算法,和你想的不一样

你好,我是黄清昊,毕业于上海交通大学信息工程专业,Hashdata 数据库内核工程师,公众号微扰理论作者。 在LeetCode上,我还有一个名字叫“微扰理论”(之后就以微扰君自称),刷了800多道题,贡献了200多篇优质算法题解,可以说对算法学习很有...

业务开发算法50讲

1、动态数组:按需分配的vector为什么要二倍扩容

你好,我是微扰君。今天我们进入第一章基础数据结构的学习。 计算机程序一直以来最根本的作用就是处理数据。即使在早期的计算机中,计算就已经不仅仅是几个数字之间的加减乘除那么简单了,经常需要处理大量线性存储的数据,一个很好的例子就是向量乘法。显然,我们需要...

业务开发算法50讲

2、双向链表:list如何实现高效地插入与删除

你好,我是微扰君。 在上一讲实现的一个简易银行账户管理系统中,每个账号都对应了一个余额,系统支持用户的开通、存/取款和查询余额。我们使用动态数组容器满足了频繁随机访问查询的需求。 但是如果要在系统里支持删除的功能,就会有一个问题:我们为了不...

业务开发算法50讲

3、双端队列:并行计算中的工作窃取算法如何实现

你好,我是微扰君。 目前我们已经学习了 vector 动态数组和 list 双向链表两种STL中的序列式容器了,今天我们继续学习另一种常见的序列式数据结构,双端队列。 在并行计算中,我们常常会用多进程处理一些复杂的计算任务。为了能够通过多进程加速计算...

业务开发算法50讲

4、栈:函数调用的秘密究竟是什么

你好,我是微扰君。 目前为止,我们已经介绍了STL里的大部分序列式容器,包括vector、deque和list,也对应着数组、队列和链表这几种基础数据结构;今天我们来学习最后一种常用的线性数据结构,栈。 栈这个词,相信每一个研发同学在学习编程的过程中...

业务开发算法50讲

5、HashMap:一个优秀的散列表是怎么来的

你好,我是微扰君。 过去四讲我们学习了STL中全部的序列式容器,数组、链表、队列、栈;今天来谈一谈另一类容器,关联式容器。所谓“关联式”,就是存储数据的时候,不只是存储元素的值本身,同时对要存储的元素关联一个键,形成一组键值对。这样在访问的时候,我们...

业务开发算法50讲

6、TreeMap:红黑树真的有那么难吗

你好,我是微扰君。 上一讲,我们讲到如何利用散列表解决类似“文档中不同单词计数”的问题,并以JDK中HashMap的实现为例讲解了散列表背后的思想。 单词计数这个问题最基本的解决思路就是建立一个线性的符号表,每次计数的时候,遍历符号表就可以找到对应单...

业务开发算法50讲

7、堆:如何实现一个高效的优先队列

你好,我是微扰君。 上一讲学习了基于红黑树的ordered_map的实现,今天我们来介绍另外一种有趣的树,heap,也就是堆。堆的应用非常广泛,我们常说的堆排序的堆就是指这种树状数据结构,除此之外还可以用来解决诸如TopK,或者合并多个有序小文件之类...

业务开发算法50讲

8、外部排序:如何为TB级数据排序

你好,我是微扰君。 之前已经学习了常用数据结构的工业级实现(包括动态数组、双向链表、双端队列、栈、哈希表、红黑树、堆),从今天开始,我们来讲讲一些经典的算法思想在工程实践中的应用。 那讲哪些算法呢?我们都知道算法是一个很大的命题,也有很多分类的方式,...

业务开发算法50讲

9、二分:如何高效查询Kafka中的消息

你好,我是微扰君。 今天我们来学习另一个常用的算法思想,二分法。这个算法思想相信即使你没有什么开发经验也不会感到陌生,而且之前讲红黑树的时候我们也简单聊过。 不知道你有没有玩过“猜数字”的游戏。大家规定一个范围,一个人在心里想一个这个范围内的具体数字...

业务开发算法50讲
1235