Algorithm C语言中的sentinel是什么?我正在学习合并排序,在合并步骤中遇到了使用sentinel作为infinity的情况
我正在学习合并排序,在合并步骤中遇到了使用sentinel作为infinity的情况 这是科曼手册中的算法。 为什么我们在第8步和第9步中使用无穷大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
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,并在最后加上无穷大。那有什么必要?这会使算法变得更好吗??如果是,如何进行?