2,3,4,5,6,7,8,9,10,11,12,13,14
当前位置: 首页  - 作者"沐尘"  - 列表 - 第4页
数据结构与算法18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

Word 这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在 Word 里输入一个错误的英文单词,它就会用标红的方式提示“拼写错误”。Word 的这个单词拼写检查功能,虽然很小但却非常实用。你有没有想过,这个功能是如何实现的呢?其实啊,一点儿都不难。只要你学完今天的内容,散列表(Hash Table)。你就能

数据结构与算法17 | 跳表:为什么Redis一定要用跳表来实现有序集合?

17 | 跳表:为什么Redis一定要用跳表来实现有序集合?

上两节我们讲了二分查找算法。当时我讲到,因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗?实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做跳表(Skip list),也就是今天要讲的内容。跳表这种数据结构对你来说,可能会比较

数据结构与算法16 | 二分查找(下):如何快速定位IP对应的省份地址?

16 | 二分查找(下):如何快速定位IP对应的省份地址?

↵通过 IP 地址来查找 IP 归属地的功能,不知道你有没有用过?没用过也没关系,你现在可以打开百度,在搜索框里随便输一个 IP 地址,就会看到它的归属地。这个功能并不复杂,它是通过维护一个很大的 IP 地址库来实现的。地址库中包括 IP 地址范围和归属地的对应关系。当我们想要查询 202.102.133.13 这个 IP 地址的归属

数据结构与算法15 | 二分查找(上):如何用最省内存的方式实现快速查找功能

15 | 二分查找(上):如何用最省内存的方式实现快速查找功能

今天我们讲一种针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。老规矩,我们还是来看一道思考题。假设我们有 1000 万个整数数据,每个数据占 8 个字节,如何设计数据结构和算法

数据结构与算法14 | 排序优化:如何实现一个通用的、高性能的排序函数?

14 | 排序优化:如何实现一个通用的、高性能的排序函数?

几乎所有的编程语言都会提供排序函数,比如 C 语言中 qsort(),C++ STL 中的 sort()、stable_sort(),还有 Java 语言中的 Collections.sort()。在平时的开发中,我们也都是直接使用这些现成的函数来实现业务逻辑中的排序功能。那你知道这些排序函数是如何实现的吗?底层都利用了哪种排序算法呢?基

数据结构与算法13 | 线性排序:如何根据年龄给100万用户数据排序?

13 | 线性排序:如何根据年龄给100万用户数据排序?

上两节中,我带你着重分析了几种常用排序算法的原理、时间复杂度、空间复杂度、稳定性等。今天,我会讲三种时间复杂度是 O(n) 的排序算法:桶排序、计数排序、基数排序。因为这些排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作线性排序(Linear sort)。之所以能做到线性的时间复杂度,主要原因是,这三个算法是非基于比较的排序算法,

Effective Modern C++27 |熟悉依万能引用型别进行重载的替代方案

27 |熟悉依万能引用型别进行重载的替代方案

上一篇避免依万能引用型别进行重载讲过使用万能引用型别进行重载可能会存在的问题, 这一篇我们就来讲讲如何规避这些问题:一、舍弃重载既然万能引用重载会有问题,那么我们就直接多写几个函数,命名成不同名字,杜绝重载就可以。二、传递const T&型别的形参使用传递左值常量引用型别来替代万能引用型别,这样在就可以限制该函数接受的参数了。三、

Effective Modern C++26 |避免依万能引用型别进行重载

26 |避免依万能引用型别进行重载

如果我们在代码中使用万能引用型别作为函数重载的一个特征标,这样在我们使用该重载函数时,实际调用的函数可能与我们期望不符:示例代码如下:#include <memory>#include <iostream>#include <set>using namespace std;//万能引用型别重载templ

Effective Modern C++25 |针对右值引用实施std::move,针对万能引用实施std::forward

25 |针对右值引用实施std::move,针对万能引用实施std::forward

我们应该知道,一个函数接受一个右值引用参数后将变成左值(可以对其取地址),所以如果在函数内部想要继续使用其右值属性,就可以对其实施std::move,将形参左值转换回右值。对于万能引用,因为其实参可能是右值,也可能是左值(最终形参都是左值),所以对其实施std::forward,实参右值将被转换回右值,实参左值将什么都不做。至于为什么不

点击下拉
用户登录