我在职业杯上读过这个问题,但除了'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;
}
}
}
现在终于找到了'find'功能。在该函数中,我首先将输入元素称为769。我浏览'index'数组并找到index [i]> 769。因此,现在我将head = index [i-1]和tail = index [i]传递给'find'函数。然后,它将在769的短距离23个元素之间进行搜索。因此,我计算出总共需要43个跳转(包括数组跳转和node = node.next跳转)来找到我想要的元素,否则会有采取769跳。
请注意:我认为创建索引数组的代码不是搜索的一部分,因此我不会在'find'函数的时间复杂度上添加复杂时间(这很糟糕)。我假设索引的创建应该在创建列表后作为单独的函数完成,或者,及时执行。就像网页显示谷歌搜索需要时间。 此外,这个问题在微软的采访中被问到,我想知道我提供的解决方案是否有用,或者我看起来像傻瓜提供这样的解决方案。该解决方案是用Java编写的。 等待您的反馈。
答案 0 :(得分:1)
很难弄清楚你在这里尝试解决的问题,或者你的解决方案应该如何运作。 (提示:完整的工作代码对两者都有帮助!)
然而,我们可以说一些一般性的事情:
您无法在i
中搜索列表数据结构(例如,在列表中查找O(N)
),除非已对其进行了某种排序。例如,对元素进行排序。
如果列表的元素已排序且您的列表是可索引的(即将元素放在位置i
是O(1)
),那么您可以使用二进制搜索并查找元素O(logN)
。
您无法将链接列表的i
位置的元素更好地O(N)
获取。
如果添加辅助数据(索引,无论如何),您可能会为某些操作获得更好的性能......但代价是存储空间增加,并使某些其他操作更加昂贵。但是,您不再拥有列表/链接列表。整个数据结构是“别的东西”。