【问题标题】:How can we reduce search time in linked list?我们如何减少链表中的搜索时间?
【发布时间】:2013-04-20 20:09:47
【问题描述】:

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

【问题讨论】:

  • 除非你能清楚地解释为什么这个解决方案没有提供任何显着的好处,否则这个解决方案不太可能在面试中帮助你。
  • 所以基本上,这个解决方案并没有提供任何显着的好处,对吧?

标签: java performance linked-list time-complexity


【解决方案1】:

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

但是,我们可以说一些一般的事情:

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

  • 1234563
  • 您无法比O(N) 更好地获取位于链表的i 位置的元素。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2021-11-28
    • 2017-02-15
    • 2016-09-08
    • 2012-05-19
    • 2021-08-23
    • 2015-10-30
    相关资源
    最近更新 更多