美团2020算法题——黑客入侵点定位
题目描述如下:
集团内部有一核心机密项目,共由150个代码模块按顺序串行执行组成(示例:模块1->模块2->…模块N…->模块149->模块150)。偶然一天,某一个模块突然被黑客入侵(当前模块也称入侵点)。因为内部已经有预防措施,现存两款从不同角度设计的反入侵检测程序,但同时也有一定检测限制:
1.输入:顺序代码段,必须以模块1开始(比如:模块1->模块2->…模块39)
2:输出:True-输入包含入侵点,False-输入不包含入侵点
3.每款检测程序可以运行多次:可多次返回False,但仅能返回一次True(由于入侵的对抗性存在,一旦输出True即报废,后续检测功能失效)
4.同一时刻只能有一款检测程序运行,每检测一次耗时10分钟
现在希望仅利用现有的两款反入侵检测程序,在最短的时间内确保可以快速定位入侵点。具体需要如何设计检测流程,时间是多久。
思路
前期思路
这道题其实与另外一道经典题目“楼层扔鸡蛋”的本质是一样的,我自己在大二参加蓝桥杯的时候遇到过这道题,当时不会做,跟这道题一样,第一反应就是二分法,但其实这里面有个问题,二分法对于尝试的次数是没有限制的,而这两道题不一样,一旦失败一次,剩下那次唯一的机会就得从头一个一个枚举,所以二分法在这里是行不通的。
介绍一个数据结构——块状链表。我们都知道,数组的优点在于可以使用索引随机访问,而链表的优点在于O(1)复杂度的插入删除,块状链表就是将这两个数据结构结合了起来。比如有n个元素,将其分为√n份,每份就有√n个元素,这样我们在查找某一个元素时就可以在√n的时间内定位到某一块,并且在块内寻找的时候复杂度也是√n,总共的复杂度就是2√n。
受此次发,我们可以将楼层分为√n份,这样只需在O(2√n)的时间内就可以找到答案。例如有25层楼,分成5楼一份,最坏的情况是再最高一层楼,也就是第5份里面的第5小份,总次数就等于5+4=9次,也就是2√n

本文介绍了美团2020年的一道算法题,涉及黑客入侵点定位问题。通过对比分析,提出用块状链表的思想来解决,类似于楼层扔鸡蛋问题。初始思路包括二分法,但因检测限制无法适用。接着运用归纳法和动态规划法进行求解,最后讨论了动态规划的优化策略,降低时间复杂度。

4601

被折叠的 条评论
为什么被折叠?



