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