我在职业杯上看过这个问题,但没有找到比'SkipList'更好的答案。我在维基百科找到的SkipList的描述很有趣,但是,我不理解“几何/二项分布”等术语......我读了它的内容并深入到概率论中。我只是想实现一种更快速搜索的方法。所以这就是我做的: 1.创建索引。 - 我写了一个函数来创建1000个节点。然后,我创建了一个类型链表的数组,并循环遍历1000个节点,并选取每个第23个元素(我脑海中随机数)并添加到我称之为'index'的数组中。我们如何减少链接列表中的搜索时间?
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为例说明输入元素。我通过'索引'数组并找到索引[i]> 769。因此,现在我将head = index [i-1]和tail = index [i]传递给'find'函数。然后,它将搜索769个短的23个元素。因此,我计算出它总共需要43个跳转(包括数组跳转和node = node.next跳转),以找到我想要的元素,否则它会有采取769跳。
请注意:我认为创建索引数组的代码不是搜索的一部分,因此我不会将时间复杂度(这太可怕了)与'查找'函数的时间复杂度相加。我认为这个索引创建应该在创建列表之后作为一个单独的函数来完成,或者是及时地完成。就像网页在谷歌搜索上显示需要时间。 另外,这个问题在微软的一次采访中被问到,我不知道我提供的解决方案是否会有好处,或者我是否会看起来像是一个傻瓜提供这样的解决方案。该解决方案已用Java编写。 等待您的反馈。
这个解决方案不可能在面试过程中帮助你,除非你能清楚地解释为什么这个解决方案没有提供任何显着的好处。 – 2013-04-20 20:19:50
所以基本上,这个解决方案没有提供任何重大的好处吗? – 2013-04-20 20:41:17