测一测丨检索算法基础,你掌握了多少?

简介: 本节讲解常见数据结构的查询效率与适用场景,涵盖数组、链表、二叉检索树、跳表、哈希表、位图、布隆过滤器及倒排索引。重点分析时间空间代价、平衡性、冲突处理及实际应用,如哈希表不适合查询具体值,倒排索引适用于多维度检索等。

1
对于无序的数组和链表,如果我们想查询一个指定的值 k,平均时间代价是:O(n)
题目解析:对于无序的数组和链表,只能采用遍历的方式查询,时间代价是 O(n)
2
在有序的数组中查询一个指定的值 k,可用的方法有:
a
顺序遍历
b
二分查找
c
都可以
d
都不行
题目解析:数组是可以顺序遍历的,当然二分查找更高效。
3
在二叉检索树中查询一个指定的值 k,最差的时间代价可能是:O(n)
题目解析:当二叉检索树退化为链表时,查询代价为 O(n)。
4
有序数组和二叉检索树相比,优点是:占用空间更少
题目解析:二叉检索树需要指针连接,占用空间大。尽管实际实现上,由于内存局部性原理,有序数组的查询性能会比二叉检索树好,但两者在查询效率的时间代价分析上都是 O(log n)。 有序数组插入新元素代价是 O(n),而二叉检索树是 O(log n)
5
以下哪个数据结构的查询空间最有可能不平衡?
a
二叉检索树
b
AVL 树
c
红黑树调表
题目解析:AVL 树和红黑树是做了平衡的二叉检索树,而跳表使用随机函数保持平衡。
6
对于跳表的描述,下面不正确的是:
a
跳表的平均查询时间代价是 O(log n)
b
跳表具有便捷的遍历能力、实际实现中,跳表在插入新元素时,只需要修改少数的前后节点的指针
c
跳表不是二叉检索树,因此无法代替二叉检索树的检索功能
7
如果在单链表中间插入一个新元素,需要改动前后 2 个指针。那么在跳表中间,插入一个拥有 2 层指针的新元素,一共需要改动几个指针?
a
2
b
3
c
4
d
5
题目解析:有 2 层指针,说明要插入单链表 2 次,每次需要改动 2 个指针,那么一共要改动 4 次。
8
以下关于哈希函数的说法,错误的是 :
a
哈希函数不会造成冲突
b
哈希函数可以将一个对象映射到一定范围的正整数内
c
哈希函数有许多种具体实现方法
d
理想的哈希函数能将数据均匀分布
9
一个理想哈希表的检索代价是:
a
O(n^2)
b
O(n)
c
O(log n)
d
O(1)
10
对于使用开放寻址法的哈希表来说,当哈希冲突发生时,不能解决冲突的方法是:
a
线性探查
b
二分查找
c
二次探查
d
双散列】
题目解析:二分查找不是用来解决哈希冲突的
11
对于使用链表法的哈希表来说,如果要保证哈希表的查询效率足够高效,有效的处理方法是:
a
保证哈希表足够空闲
b
使用均匀的哈希函数
c
在链表足够长的时候
d
转为红黑树
e
以上都是
题目解析:ABC 这三种处理方法都可以提高哈希表的查询效率
12
哈希表和有序数组相比,有什么缺点?
a
需要更多的存储空间
b
遍历性能不高
c
以上都是
d
以上都不是
题目解析:哈希表需要保持足够空闲,因此需要更多空间,并且它没有高效遍历能力,只能穷尽整个数组空间来查找每一个元素。
13
关于位图的描述,下面哪一项是错误的?
a
如果元素的值范围跨度较大,位图会比较耗费空间
b
许多编程语言中直接支持以 bit 为数组的最小单位
c
位图的访问时间代价是 O(1) 级别的
d
当元素不存在时,可以直接将位图对应位置置为 0
题目解析:许多编程语言并不支持,因此需要设计位图的访问操作
14
以下关于布隆过滤器和位图的特点描述,正确的是:
a
布隆过滤器一定要使用 3 个以上的哈希函数
b
布隆过滤器不存在错误率
c
以上都对
d
以上都不对
题目解析:布隆过滤器存在错误率,并且哈希函数个数可以从 1 个到多个。
15
下列哪个场景不能使用布隆过滤器?
a
用户注册账号时,需要查询 ID 是否已经被注册过
b
查询一个用户的 ID 是什么
c
在爬虫系统中
d
判断一个网站是否被抓取过、邮箱系统需要快速判断一个陌生的邮件地址,是否在垃圾邮件列表中
题目解析:不是查询状态,而是查询具体值,这种情况不适合使用布隆过滤器。
16
对文档排好序以后,创建倒排索引的时间代价是:
a
O(n^2)
b
O(n)
c
O(log n)
d
O(1)
题目解析:依次遍历和分析文档,然后插入倒排表
17
以下关于倒排索引的说法,错误的是:
a
在倒排索引中,为了提高检索效率,posting list 中的数据一般是有序
b
在联合查询两个 key 的时候,我们可以使用归并的方式,对两个 key 对应的 posting list 进行结果合
c
有了倒排索引就不需要使用正排索引
d
在一个系统中,如果有需要,我们可以建立多个倒排索引
18
在倒排索引中,key1 的 posting list 长度为 m,key2 的 posting list 长度为 n,其中 m > n。查询条件为:key1 和 key2 要同时存在。假设查询结果长度为 k,那么:
a
k >= m
b
n < k < m
c
k <= n
d
以上都有可能
题目解析:同时存在是取集合的交集,那么结果的个数一定不会大于最小的集合个数。
19
在倒排索引中,key1 的 posting list 长度为 m,key2 的 posting list 长度为 n,其中 m > n。查询条件为:“key1 和 key2 有一个存在即可”(查询表示为“key1 or key2”)。 假设查询结果长度为 k,那么:
a
k >= m
b
n < k < m
c
k <= n
d
以上都有可能
题目解析:同时存在是取集合的并集,那么结果的个数一定不会小于最大的集合个数。
20
如果我们想在一个有许多电影信息的影评平台中,根据年份、电影类型、地区等方式检索。正确的设计方案是:
a
按电影名为 key 建立正排索引,将年份、电影类型、地区分别建立倒排索引
b
将年份为 key 建立正排索引,将电影名、电影类型、地区分别建立倒排索引
c
将电影类型为 key 建立正排索引,将电影名、年份、地区分别建立倒排索引
d
将地区为 key 建立正排索引,将电影名、年份、电影类型分别建立倒排索引
题目解析:因为年份、类型、地区这些都是属性,本身没有复杂内容,因此适合作为倒排。而电影是有复杂内容的主体,适合作为正排。

相关文章
|
2月前
|
缓存 算法 搜索推荐
特别加餐丨倒排检索加速(二):如何对联合查询进行加速?
本文介绍工业界中联合查询的四种加速方法:调整次序法利用集合大小差异优化求交顺序;快速多路归并法结合跳表提升多列表归并效率;预先组合法通过预计算热门查询提升响应速度;缓存法则借助LRU机制缓存临时热点结果,减少重复计算。四者从数学、算法与工程角度协同优化复杂检索性能。
48 0
|
2月前
|
存储 算法 搜索推荐
特别加餐 | 倒排检索加速(一):工业界如何利用跳表、哈希表、位图进行加速
本文深入解析倒排索引在工业界的实际优化:通过跳表、哈希表和位图加速求交集操作,并详解Roaring Bitmap如何结合三种基础数据结构,实现高效检索与空间压缩的平衡,展现基础算法在真实系统中的综合应用。
195 0
|
2月前
|
存储 自然语言处理 分布式计算
08 | 索引构建:搜索引擎如何为万亿级别网站生成索引?
针对超大规模数据场景,如搜索引擎需处理万亿级网页,倒排索引远超内存容量。解决方案是:先将文档分批,在内存中为每批构建小型倒排索引,再写入磁盘生成有序临时文件;最后通过多路归并技术合并临时文件,生成全局有序的最终倒排文件。此过程类似MapReduce思想,支持分布式加速。检索时,优先将词典加载至内存(可用哈希表或B+树),结合磁盘上的posting list进行高效查询,对过长的列表可采用分层索引或缓存优化。
56 0
|
2月前
|
存储 监控 NoSQL
07 | NoSQL 检索:为什么日志系统主要用 LSM 树而非 B+ 树?
B+树适用于读多写少场景,但在日志、监控等高频写入的大数据场景下性能受限。LSM树通过将数据分内存(C0树)和磁盘(C1树)两层,利用WAL保障数据安全,以批量合并替代随机写,显著提升写入性能,成为NoSQL数据库的核心技术,更适配写密集型应用。
53 0
|
2月前
|
存储 数据采集 缓存
| 状态检索:如何快速判断一个用户是否存在?
本文探讨如何高效判断对象是否存在,对比有序数组、二叉树、哈希表的查询性能,引出位图与布隆过滤器。位图利用bit级存储,节省空间;布隆过滤器通过多哈希函数降低冲突,实现O(1)查询,虽有误判但适用于容忍错误率的场景,如缓存、爬虫去重。二者在时间与空间效率上优于传统结构,广泛用于大型系统中。
60 0
|
2月前
|
存储 机器学习/深度学习 自然语言处理
05 | 倒排索引:如何从海量数据中查询同时带有「极」和「客」的唐诗?
本文介绍了正排索引与倒排索引的原理及应用。通过唐诗检索的场景对比,说明键值查询与关键词搜索的区别。正排索引以文档ID为键,适合精确查找;而倒排索引以关键字为键,记录包含该词的文档列表,显著提升多关键词联合查询效率。文中详述了倒排索引的构建步骤、链表归并求交集的查询优化方法,并拓展至多路归并与实际应用场景,如搜索引擎、推荐系统等。倒排索引虽原理简单,却是现代信息检索的核心技术之一。
45 0
|
2月前
|
缓存 安全 Java
第五章 Spring框架
Spring的IOC(控制反转)指对象由容器创建并管理,无需手动new;DI(依赖注入)则是容器自动将依赖对象注入。二者降低了耦合,提升了可维护性。常用注解如@Service、@Autowired实现声明与注入,bean默认单例非线程安全,可通过@Scope设置作用域。循环依赖通过三级缓存解决,但构造函数循环依赖需@Lazy规避。AOP基于动态代理实现日志、事务等横切逻辑,事务通过@Transactional控制传播行为与回滚。
41 0
|
2月前
|
存储 算法 关系型数据库
06丨数据库检索:如何使用 B+ 树对海量磁盘数据建立索引?
本课深入探讨工业级检索系统中的实际挑战,重点解析B+树如何通过索引与数据分离、多阶平衡树结构及双向链表优化,实现对磁盘大规模数据的高效读写与范围查询,帮助你掌握数据库底层索引的核心设计原理。
51 0
|
2月前
|
存储 算法 搜索推荐
01 | 线性结构检索:从数组和链表的原理初窥检索本质
本文探讨数组与链表的检索原理及效率。数组通过连续存储支持随机访问,适合二分查找,实现O(log n)高效检索;链表则因非连续存储仅支持顺序访问,检索效率为O(n),但插入删除更灵活。通过对比二者存储特性,揭示检索核心:合理组织数据以快速缩小查询范围。进一步可通过改造链表结构(如节点存数组)提升效率,融合两者优势。
44 0
|
2月前
|
存储 缓存 算法
非线性结构检索:数据频繁变化的情况下,如何高效检索
通过类比文件系统的树状结构,本文深入探讨了非线性数据结构如何提升检索效率。针对有序数组在频繁更新下的性能瓶颈,引出二叉检索树与跳表两种解决方案。二叉检索树通过有序的左右子树实现二分查找,但需AVL或红黑树等机制维持平衡以保障O(log n)效率;跳表则为链表添加多级指针,借助随机层数实现近似平衡的快速检索,结构更简单且便于范围查询。两者均通过合理组织数据,在动态场景下兼顾高效查找与灵活修改,优于传统数组。
64 0