【问题标题】:Stack implementation the Trollface way [closed]堆栈实现 Trollface 方式[关闭]
【发布时间】:2016-04-14 13:13:42
【问题描述】:

在我的软件工程课程中,我遇到了堆栈的以下特征,由我浓缩:你推什么就是你弹出什么。完全公理化的版本我 Uled here.
作为一个天生的巨魔,我立即发明了巨魔堆栈。如果它上面已经有超过 1 个元素,则推送会导致这些元素的随机排列。我立即与讲师争论这种无意义的实现是否真的违反了公理。我说不,顶部元素保持在原处。他们说是的,你可以以某种方式递归地应用 push-pop-axiom 来“更深入”。我没有看到。谁是对的?

【问题讨论】:

  • 违反公理是pop(push(s,x)) = s

标签: algorithm stack


【解决方案1】:

违反的公理是pop(push(s,x)) = s。将sn > 1 不同的条目放在一起。如果你实现push 使得push(s,x)s'xs's 的随机排列,那么由于pop 是一个函数,你有一个问题:你如何反转random_permutation() 这样那个pop(push(s,x)) = ss' 的原像可能是s 的任何n! > 1 排列,并且无论您映射到哪一个,都有n! - 1 > 0 其他原始排列s''pop(push(s'',x)) != s''

【讨论】:

  • 可能我的问题是公理如何被迭代。如果再次为 x...mmmh 插入公理,现在我想我看到了。
  • @HaukeReddmann 据我所知,不需要迭代。即使在一个pop(push()) 之后,您很可能拥有与开始时不同的堆栈(如果确定性地完成了反转排列,那么将有一个输入堆栈将由pop(push()) 映射回自身)。跨度>
【解决方案2】:

在这种情况下,每个人都可能很容易看到,但对你来说却不是(因此你使用了“troll”这个词),在一张纸上简单地运行“程序”总是有帮助的。

写下当你按下和弹出几次时会发生什么,你就会看到。

您还应该能够看到这些公理与您的堆栈的实际行为非常接近;它们不仅是为了好玩,而且它们深入地(在这个词的多种含义中)用它的方法指定了数据结构。您甚至可以将它们视为描述堆栈进出的“正式系统”。

请注意,怀疑对你还是有好处的;这会导致 a) 更好的洞察力和 b) 检测上级所犯的错误。在这种情况下,他们是对的,但在某些情况下,它可以为您节省大量时间(例如,在“哥德尔、埃舍尔、巴赫”中寻找“MU”之谜的解决方案时,这对您来说是一本极好的读物,我认为)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2016-10-04
    • 2022-01-17
    • 2016-07-05
    • 1970-01-01
    相关资源
    最近更新 更多