Algorithm 如何摆脱合并排序中的哨兵?
我知道sentinel的使用在某种程度上等同于零填充(在复杂性的意义上) 对于那些不知道零填充是什么的人: 我们附加了一些零(或其他值,没关系),使大小为2的幂,在应用合并排序算法后,我们消除了附加的零Algorithm 如何摆脱合并排序中的哨兵?,algorithm,mergesort,divide-and-conquer,Algorithm,Mergesort,Divide And Conquer,我知道sentinel的使用在某种程度上等同于零填充(在复杂性的意义上) 对于那些不知道零填充是什么的人: 我们附加了一些零(或其他值,没关系),使大小为2的幂,在应用合并排序算法后,我们消除了附加的零 然而,除了零填充之外,还有其他方法可以消除哨兵吗?您混淆了两个不相关的概念。它们并不接近于同等水平。sentinel是放置在列表(逻辑)末尾的额外元素 它有意地具有一些“限制”值,允许通常停止数组遍历的测试也在数组末端停止遍历 例如,如果我们在列表[1,8,4,7]中查找值大于5的第一个元素,并
然而,除了零填充之外,还有其他方法可以消除哨兵吗?您混淆了两个不相关的概念。它们并不接近于同等水平。sentinel是放置在列表(逻辑)末尾的额外元素 它有意地具有一些“限制”值,允许通常停止数组遍历的测试也在数组末端停止遍历 例如,如果我们在列表[1,8,4,7]中查找值大于5的第一个元素,并且没有哨兵,那么算法将是:
i = 0;
while i < 4 { if a[i] > 5 return i; i = i + 1 }
return "not found"
i=0;
而i<4{如果a[i]>5返回i;i=i+1}
返回“未找到”
我们将继续添加一个大于5的元素,比如6。[1, 8, 4, 7, 6]. 现在搜索变成了
i = 0;
while a[i] <= 5 { i = i + 1 }
return if i < 4 then i else "not found"
i=0;
当你使用sentinel时,你是在含蓄地“填充”它。这意味着,如果您将创建的哨兵数量和序列大小相加,您将得到该序列大小的最接近的幂2。:)啊,对不起,我误解了。我以为你说的是显式填充数组是出于某种原因……不用担心,我没有精确地表达出来。我现在就试着编辑,这解释得很好。但是你知道我们如何在不使用哨兵或零填充的情况下仍然可以合并排序吗?我从来没有见过使用零填充或哨兵的合并排序。查找任何合并排序代码。这里有一个。