Algorithm C语言中的sentinel是什么?我正在学习合并排序,在合并步骤中遇到了使用sentinel作为infinity的情况

Algorithm C语言中的sentinel是什么?我正在学习合并排序,在合并步骤中遇到了使用sentinel作为infinity的情况,algorithm,mergesort,sentinel,Algorithm,Mergesort,Sentinel,我正在学习合并排序,在合并步骤中遇到了使用sentinel作为infinity的情况 这是科曼手册中的算法。 为什么我们在第8步和第9步中使用无穷大 MERGE(A, p, q, r) 1 n1 ← q − p + 1 2 n2 ← r − q 3 create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1] 4 for i ← 1 to n1 5 do L[i ] ← A[ p + i − 1] 6 for j ← 1 to n2 7 do

我正在学习合并排序,在合并步骤中遇到了使用sentinel作为infinity的情况

这是科曼手册中的算法。 为什么我们在第8步和第9步中使用无穷大

MERGE(A, p, q, r)

1 n1 ← q − p + 1

2 n2 ← r − q

3 create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]

4 for i ← 1 to n1

5 do L[i ] ← A[ p + i − 1]

6 for j ← 1 to n2

7 do R[ j ] ← A[q + j ]

8 L[n1 + 1] ← ∞

9 R[n2 + 1] ← ∞

10 i ← 1

11 j ← 1

12 for k ← p to r

13 do if L[i ] ≤ R[ j ]

14 then A[k] ← L[i ]

15 i ← i + 1

16 else A[k] ← R[ j ]

17 j ← j + 1

sentinel是一个虚拟值,用于区分应该存在的值(例如用户输入)和控制值(需要特别处理的值)。一个简单的例子是使用null-to-null标记列表的结尾


在这种特定情况下,当列表的两部分重新合并在一起时(例如,当合并任何与无穷大相比的内容时,合并结束的处理将被简化),无穷大的使用简化了比较逻辑。

哨兵值只是一个没有有效值的值

如果我的域被限制为非零正数,零可以是一个哨兵

如果我的域被限制为正数,否则我会使用无符号整数,我可以使用有符号整数和负数作为哨兵。(当然,我失去了执行此操作的unsigned范围的上半部分。)

如果我使用指针指向一个值,空指针可以是一个哨兵

如果我使用的是c字符串,它是指针(或衰减为指针的数组),我可以使用空指针,或者在某些情况下,指向
(char)0
(“空字符串”)作为哨兵


哨兵只是一个你的有效输入永远无法接受的值。由于不能将其误认为有效值,因此当代码看到sentinel值时,它可以执行“特殊”操作,而不是对有效值进行正常处理。

在这种情况下,在每个递归步骤中向每个子数组的末尾添加无穷大(大于任何数字),在合并回两个子数组时,将避免在以下情况下进行额外比较

  • 当第一个数组结束而第二个数组剩余时
  • 或者当第二个数组结束而第一个数组剩余时

在这两种情况下都不需要写额外的逻辑,以检查是否有任何数组结束了,如果结束了写一些额外的代码

这不是c代码???。这只是算法。。。伪codeNull终止字符串也是一个完美的例子。那么为什么我们在这里使用它。。。请解释一下。在我的c代码中,我应该写什么来代替无穷大呢?我已经试着解释过了。如果你用C写,你可以用一个很大的数字来表示哨兵:)你可以用INT_MAX from limits.h来得到最大的数字。是的,我知道了。但我的问题是,为什么我们使用大小为n+1的数组L和R,并在最后加上无穷大。那有什么必要?这会使算法变得更好吗??如果是,如何进行?