哨兵与传递计数

Posted

技术标签:

【中文标题】哨兵与传递计数【英文标题】:Sentinel vs. passing around a count 【发布时间】:2014-05-17 08:37:26 【问题描述】:

我在 C 语言中有一个结构,其中包含一个数组,我在该数组上执行堆栈操作。

如果堆栈已满,我需要防止将元素压入数组末尾,并返回错误条件。

将堆栈的大小作为结构的一个元素包含在内,并将该数量的元素传递给 stack_push() 函数是否更好,或者我应该在堆栈数组的末尾有一个哨兵元素?

【问题讨论】:

使用大小变量(解释太长,无法评论) 我真的很喜欢阅读一些推理。请随时将其放在答案中,如果我同意推理,我可以接受您的答案。 考虑 C 字符串(以 '\0' 结尾的字符数组)和 C++ 字符串(神秘编码 char,以及可快速检索的长度,并且可能嵌入了 '\0')。哪个更通用?哪个比较新?归根结底,这取决于您的目标。一个并不总是比另一个更好。 【参考方案1】:

你打算如何实现你的stack_push()函数?

如果它需要扫描到数组的末尾以寻找一个空槽来插入推送的元素,那么无论如何你都需要一个标记值(例如,如果数组包含指针元素,则为 NULL)。但请注意,算法将是 O(N)。

另一方面,跟踪数组中活动元素的数量允许您的算法对于推送(以及对于弹出)是 O(1)。它还省去了在数组中分配一个额外元素的麻烦,如果它是一个结构数组,这可能很重要。

一般来说,大多数堆栈数据结构都是使用数组和计数器来实现的。

【讨论】:

【参考方案2】:

你会使用什么标记值?当然,你必须确保这个函数的调用者绝对不会使用这个值。如果您的函数在看似合理的输入的标记值处过早停止,则调试可能会非常混乱。

对于像字符串这样的东西,很容易使用 NULL 来终止,因为字符串不应该有零字节。但是,如果您开始在某些地方使用哨兵而不在其他地方使用,那么尝试使用您的代码的开发人员可能会开始感到非常困惑。

我会说使用大小参数,除非有一个非常明确和明显的哨兵选择,甚至可能不会。

【讨论】:

以上是关于哨兵与传递计数的主要内容,如果未能解决你的问题,请参考以下文章

Redis的哨兵模式和集群模式

redis源码阅读-之哨兵流程

Redis哨兵架构(哨兵搭建,哨兵原理)

Day734.哨兵集群:哨兵挂了,主从库还能切换吗?-Redis 核心技术与实战

redis集群介绍与搭建(主从哨兵cluster集群)!

redis集群介绍与搭建(主从哨兵cluster集群)!