时长01:18大小1.21M
作者回复: 第一个问题分析得很好!你基本解释清楚了数据库是如何满足第一个问题的。当然,如果只使用基础篇学到的知识,数组就可以了。
第二个问题你考虑到了模糊查询问题,所以以字为单位建立倒排索引,这也是很好的思考!
作者回复: 题目都附了讲解,可以再看一看
作者回复: 很好!有自己的理解和设计。能针对自己理解的场景给出合理的数据结构和解决方案。
最后一句其实很实在,的确如果数据量不大的话,简单粗暴也不失为一种解决方案。
作者回复: 对于无形的回答,我从两方面给你分析:
1.内存中的数据结构是怎么样的
2.磁盘中的文件是怎么样的(其实是怎么将内存数据持久化到磁盘)
由于我们在基础篇中没有讲到磁盘(我在进阶篇会讲到),因此我出这道题的目的是只要考虑内存中的数据结构就好了。不过既然你们说到了持久化,我就一起聊聊。
对于题目基础,他做了一个预处理:假设所有用户信息存在一个“用户文件”中。每一行就是一个用户信息。
对于第一个问题,他是用有序数组实现的,数组中的单元为(用户ID,该信息在文件中的行号),这样可以支持ID查找和范围查找。如果要将这个数组持久化到磁盘,其实可以有很多种处理方式(比如二进制写入磁盘数据块;或者简单点理解,也可以每个数组元素写一行;或者每个元素不就是存着ID和行号么?这些都是数字,你就在文件里写入这些数字,用空格和逗号隔开就可以了;)。这个文件,就叫做“用户索引文件”。
第二个问题他是使用倒排索引完成。倒排索引的key是员工姓名,posting list是员工ID的列表(因为员工可能重名),可以用数组或链表实现。倒排索引也可以保存为一个文件,你可以文件的每一行保存(key+空格+ ID列表)就好了。ID列表中可以用逗号分隔ID。这个就是他说的“倒排索引文件”。
第三个问题他也是用倒排索引,以部门ID或部门名字为key,以员工ID列表为posting list就好了。持久化和第二个问题的方法一样。
因此,在磁盘中,一共会有四个文件,分别是“用户文件”,“用户索引文件”,“姓名倒排索引文件”,“部门倒排索引文件”。这就是他的持久化方案。
作者回复: 考虑得很全面!从存储到检索都描述得很清晰。而且还考虑到了姓名的模糊查询。
作者回复: 思考得很细致!整体思路很清晰,还考虑到了部门隐含的层级关系。
作者回复: 你的思考已经非常深入了!我就不点评你的题目答案了,和你聊聊你的问题吧。
1. 是否要学习硬件知识?
随着学科的精细化分工,知识也变得越来越细化,全才是非常少见的。更多的时候,我们是有重点地选择某部分知识进行钻研,然后对于其他领域进行一些了解。
比如说,检索技术的知识导图中,你会看到我就划分了存储介质层,数据结构和算法层,检索专业领域层,还有应用层。对于大部分软件开发工程师而言,对于存储介质,做到了解即可。了解的目的,是要能选择合适的技术方案来搭建对应的系统。
幸运的是,硬件革命性地发展并没有那么快,现在我们常用的存储介质,其实就是内存,磁盘,还有SSD。因此,只要稍微花一些时间,了解一下它们的特点,就能在很长时间内帮助你做合适的设计和决策。
当然,如果能更深入地了解硬件知识,做到软硬件通吃,那么这样的人才,就有可能做出一些突破性的成果。
2. 是否可以有抽象的中间层?
实际上,知识的发展体系,就是一个逐步抽象中间层的过程。比如说,从汇编语言到高级语言,就是一个典型的例子。
对于存储和检索也一样。比如说数据库,其实就是使用SQL语句屏蔽了很多技术细节,至于数据是用倒排索引进行检索的,还是B+树,这些细节都已经帮你屏蔽掉了。
包括现在也有人在研究如何统一关系型数据库和NoSQL,用统一的存储和查询机制来解决。
还有云存储,云计算,本质也是将后端的细节屏蔽掉,让使用者只需要调用put和get就可以获得数据,至于后面是什么存储介质,什么数据结构,并不用关心。
让平台越来越智能化和傻瓜化,搭建越来越多便捷的中间层和平台,就是大量工程师在持续进行的工作。因此,如果我们能具备这样的能力,那么就能在这样的浪潮中找到属于自己的机会。
作者回复: 整体思路没问题。不过可以细化一下,用什么数据结构?怎么支持范围查询?