为什么合并排序时会发生堆栈溢出?

时间:2019-06-04 12:13:03

标签: php linked-list stack-overflow mergesort doubly-linked-list

因此,我没有等待this topic中的答案,所以决定实现我的数据结构。
我遇到的问题:对小列表进行排序时,一切都很好,但是对具有487个项目的列表进行排序时,merge方法中会发生堆栈溢出。

这是代码中负责排序的部分。
有什么想法吗?

private function mergeSort($node) {
        if ($node == null || $node->next == null) {
            return $node;
        }

        $second = $this->split($node);

        $node = $this->mergeSort($node);
        $second = $this->mergeSort($second);

        return $this->merge($node, $second);
    }

private function split(Word $word) {
        $fast = $word;
        $slow = $word;
        while ($fast->next !== null && $fast->next->next !== null) {
            $fast = $fast->next->next;
            $slow = $slow->next;
        }
        $temp = $slow->next;
        $slow->next = null;
        return $temp;
    }

private  function merge($first, $second) {
        if ($first === null) {
            return $second;
        }

        if ($second === null) {
            return $first;
        }

        if ($first->begin < $second->begin) {
            $first->next = $this->merge($first->next, $second);
            $first->next->prev = $first;
            $first->prev = null;
            return $first;
        } else {
            $second->next = $this->merge($first, $second->next);
            $second->next->prev = $second;
            $second->prev = null;
            return $second;
        }
    }

用法:

//some code here 

$sortedLinedList = $linkedList->mergeSort($linkedList->head);
// stack overflow happens

更新: 我发现堆栈溢出并不总是直接取决于列表中的项目数。有时堆栈可能溢出350个元素,有时溢出487个元素。也许它取决于列表本身的数据。我唯一直接使用节点数据的地方是merge方法中的比较。可能是因为变量“ begin”包含浮点类型的值而发生的吗?我尝试过:

round($first->begin, 2) < round($second->begin, 2)

但这对我没有帮助:(

0 个答案:

没有答案