在包含数百万个节点

时间:2016-03-29 11:37:30

标签: algorithm data-structures linked-list

在接受采访时,我被问到这个问题。我知道几种解决这个问题的方法。但重点是它包含数百万个节点

我知道我们可以用两个指针来解决这个问题。我们也可以使用HashMap解决这个问题。他想知道优化的解决方案,因为列表中有数百万的节点。

之后,我还建议将列表分成多个块,然后应用多线程来加快进程。但他并不满意。还有其他方法我没有关注。使用多线程,我们还必须维护一组访问的下一个节点,就像将列表分成块一样,循环可能分为两部分。

我不是要求任何实施。只是向我提供一些方向,以便我可以更多地思考它。

1 个答案:

答案 0 :(得分:2)

如果你开始使用Floyd的算法(双指针的话),然后面试官想让你更快地提出建议,那你就走错了方向。维护HashMap会使方式更长。多线程也没用,因为它是一个链表,你必须走它来分工。

我会开始使用Brent的算法,该算法遵循比Floyd算法更少的指针,并且通常更快,因为它对缓存友好。维基百科在这里对布伦特算法进行了很好的描述:https://en.wikipedia.org/wiki/Cycle_detection#Brent.27s_algorithm

也可以通过各种方式加速布伦特的算法。 Brent的算法确保您访问节点的次数不会超过您查找周期所需​​的两倍。例如,通过在简单单向关联哈希(无冲突避免)中存储多于1个先前节点,您可以减少此因子,直到它任意接近1。