是否有这样的数据结构:
linked list
或data saved on disk
。然后当您进行搜索时,首先检查数组,然后执行常规搜索(链接列表搜索或二进制搜索,以防磁盘数据)。
这与jump search
,sample search
和skip lists
非常相似,但我认为是不同的算法。
请注意我在磁盘上提供link list
或文件的示例,因为它们的结构很慢。
答案 0 :(得分:1)
我不知道是否有这个算法的名称(我认为它不值得一个,但如果没有,它可以承担我的:),但我确实实现了类似于10年前的那样的面试。
您可以拥有一个指向列表元素的指针数组。一个固定大小的数组,比如256个指针。当您构造列表或第一次遍历它时,您将指针存储到数组中的元素。因此,对于256个或更少元素的列表,您将拥有指向每个元素的指针。
当列表增长超过256个元素时,通过将128个偶数指针移动到数组的开头,可以删除每个奇数指针。当指针数组再次填满时,重复该过程。在每个这样的点上,您将地址最终位于指针数组中的列表元素之间的步长加倍。最初你将每个元素的地址放在那里,然后是每个元素的地址,然后是四分之一,依此类推。
最终得到一个指向列表元素的指针数组,列表长度为256。
如果列表是单链接的,则从其开头或结尾定位第i个元素将减少为在列表的1/256中搜索。 如果列表已排序,您可以对阵列执行二进制搜索,以找到bin(列表的1/256部分)的位置。