因此,我没有等待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)
但这对我没有帮助:(