【发布时间】:2017-01-19 00:11:05
【问题描述】:
我正在自学算法并转向Open Data Structures(C++ 版)免费电子书作为参考。在我试图掌握这个主题的过程中,我决心完成书中的所有挑战。但是,我很难理解一种特定的不受欢迎的算法如何为 add() 和删除提供 O(1)。
其中一个挑战是使用这些属性创建一个随机队列 (exercises)。
练习 2.2。设计和实现一个随机队列。这是 Queue 接口的一个实现,其中 remove() 操作删除一个在当前队列中的所有元素中随机均匀选择的元素。 (将 RandomQueue 想象成一个袋子,我们可以在其中添加元素或伸手可及并盲目地删除一些随机元素。) RandomQueue 中的 add(x) 和 remove() 操作应该在每个操作中以恒定时间运行。
本章涉及array-backed-list,因此从这个意义上说,元素的添加和删除相当简单。但是,有时必须根据大小重新创建数组。您应该将旧数组复制到新数组。这基本上可以是 O(n)。另外我相信我需要使用一个圆形数组。所以基本上我必须在数组中移动索引以产生 O(n-1) 的时间复杂度。
我对如何计算和测量这些算法感到非常困惑。这本书确实谈到了 O(m),但有时相当模糊。
定理 2.2。 ArrayQueue 实现(FIFO)队列接口。忽略调用 resize() 的成本,ArrayQueue 在 O(1) 时间内支持操作 add(x) 和 remove() 。此外,从一个空的 ArrayQueue 开始,任何 m 个 add(i, x) 和 remove(i) 操作序列都会导致在所有对 resize() 的调用期间总共花费 O(m) 时间。
就像你怎么能忽略这一点一样,我并没有与你如何能去掉那部分时间复杂度的联系?
【问题讨论】:
-
我想你想看看 Amortized O(1): stackoverflow.com/questions/200384/constant-amortized-time 。即使我错了,好好读书。
标签: c++ arrays algorithm data-structures time-complexity