我们如何减少链表中的搜索时间?

时间:2013-04-20 20:09:47

标签: java performance linked-list time-complexity

我在职业杯上读过这个问题,但除了'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编写的。 等待您的反馈。

1 个答案:

答案 0 :(得分:1)

很难弄清楚你在这里尝试解决的问题,或者你的解决方案应该如何运作。 (提示:完整的工作代码对两者都有帮助!)

然而,我们可以说一些一般性的事情:

  • 您无法在i中搜索列表数据结构(例如,在列表中查找O(N)),除非已对其进行了某种排序。例如,对元素进行排序。

  • 如果列表的元素已排序且您的列表是可索引的(即将元素放在位置iO(1)),那么您可以使用二进制搜索并查找元素O(logN)

  • 您无法将链接列表的i位置的元素更好地O(N)获取。

如果添加辅助数据(索引,无论如何),您可能会为某些操作获得更好的性能......但代价是存储空间增加,并使某些其他操作更加昂贵。但是,您不再拥有列表/链接列表。整个数据结构是“别的东西”。