【问题标题】:Data Structure and Algorithms in pythonpython中的数据结构和算法
【发布时间】:2020-03-12 08:24:50
【问题描述】:

Q1 - 假设一个最初为空的队列 Q 总共执行了 32 个入队 操作、10 个首次操作和 15 个出队操作,其中 5 个 引发了被捕获和忽略的空错误。什么是电流 Q的大小?

我认为这个问题的答案是 22 ;但我在这个问题上需要帮助...

Q2 - 上一个问题的队列是否是 ArrayQueue 的一个实例 使用容量为 30 的初始数组,并且其大小从未更大 大于 30,前面的实例变量的最终值是多少?

【问题讨论】:

  • 这些看起来像家庭作业问题。如果您需要帮助,请展示您自己的努力,我们会尽力为您提供指导。
  • 这不是家庭作业;我毕业了,我想在数据结构方面提高自己

标签: algorithm data-structures queue


【解决方案1】:

从严格定义队列上的操作开始会有所帮助:

  • void Enqueue(Item) - 将 Item 插入队列末尾。
  • Item Dequeue - 移除并返回队列前面的 Item。如果调用操作时队列为空,则抛出 Empty Error。
  • Item First - 返回队列前面的 Item,不要移除它。

这意味着如果队列大小大于 0,Enqueues 会将队列大小加一,Dequeues 从队列大小中删除一个,并且 Firsts 不会影响队列大小。

所以我们有 32 个增量、10 个空操作和 15 个潜在减量。其中 5 个可能的减少量不会影响队列大小,因此只剩下 10 个。

32 * 1 + 10 * 0 + 5 * 0 + 10 * -1 = 22

这仅在操作如上定义时才有效。比如我们把Enqueue和Dequeue的定义改成这样:

  • void Enqueue(List of Items) - 将 List 中的每个 Item 插入队列末尾。
  • 项目列表 Dequeue(Count) - 从队列的前面移除并返回 Count 个项目。返回 max(Count, queue's size) 个项目。

现在,我们没有足够的信息来回答这个问题。这就是为什么准确描述您正在考虑的操作很重要的原因。

关于第二个问题,假设 ArrayQueue 被实现为大小为 30 的循环数组缓冲区(30 元素数组,带有指向“前”和“后”元素的指针),并假设入队发生在“ back”和Dequeues发生在“front”,那么我们需要做的就是计算Dequeues的数量,因为这是唯一影响front指针的操作。

总共有 15 种可能的操作可以改变前面指向的位置。其中 5 个不会改变 front 的位置,因此 front 总共移动了 10 次。假设数组是零索引的,front 将指向数组索引 10(第 11 项,为下一个 Dequeue 或 First 操作做好准备)。

ArrayQueue 的不同实现会有不同的答案。同样,在尝试推理结构的内部运作时,具体说明结构的实现是有帮助的。

【讨论】: