我在职业杯上阅读了这个问题,但除了“SkipList”之外没有找到任何好的答案。我在 wikipedia 上找到的 SkipList 的描述很有趣,但是,我不理解诸如“几何/二项式分布”之类的术语......我阅读了它是什么并深入研究了概率论。我只是想实现一种方法来更快地进行一些搜索。所以这就是我所做的: 1. 创建索引。- 我写了一个函数来创建 1000 个节点。然后,我创建了一个类型为链表的数组,并遍历了 1000 个节点,并选择了每个第 23 个元素(我想到的随机数)并添加到我称之为“索引”的数组中。
SLL index = new SLL[50]
现在创建索引的函数:
private static void createIndex(SLL[] index, SLL head){
int count=0;
SLL temp = head;
while(temp!=null)
{
count++;
temp = temp.next;
if((count==23){
index[i] = temp;
i++;
count=0;
}
}
}
现在终于是“查找”功能了。在该函数中,我首先以输入元素 769 为例。我遍历'index'数组并找到index[i]>769。因此,现在我将 head = index[i-1] 和 tail = index[i] 传递给“find”函数。然后它将在 23 个元素的短范围内搜索 769。因此,我计算出总共需要 43 次跳转(包括数组跳转和 node=node.next 跳转)才能找到我想要的元素,否则会有跳了 769 次。
请注意:我认为创建索引数组的代码不是搜索的一部分,因此我不会将其时间复杂度(这很糟糕)与“查找”函数的时间复杂度相加。我假设索引的创建应该在创建列表后作为单独的函数完成,或者及时进行。就像网页在谷歌搜索中出现需要时间一样。另外,这个问题是在微软的一次采访中被问到的,我想知道我提供的解决方案是否有用,或者我看起来像个傻瓜,提供了这样的解决方案。解决方案是用 Java 编写的。等待您的反馈意见。