put/x/: Push x on the right-hand stack.
y=get//: If the left-hand stack is empty:
Pop each element off the right-hand stack and
push it onto the left-hand stack. This effectively
reverses the right-hand stack onto the left-hand stack.
Pop and return the top element of the left-hand stack.
现在我争辩说摊销成本
put
和
get
平等的
O/1/
, 假设我开始和完成空白队列。 分析很简单:我总是放
put
在正确的堆栈中,
get
- 在左边。 因此,除了提案
If
, 每个
put
是一个
push
, 和每一个人
get
是一个
pop
, 两者都是
O/1/
. 我不知道我有多少次执行报价
If
- 这取决于模板
put
s 和
get
S-虽然我知道每个元素从右侧堆叠到左侧的一部分移动一次。 因此,整个序列的总成本 n
put
s 和 n
get
s 等于: n
push
es, n
pop
s 和 n
move
s, 在哪里 a
move
-这是 a
pop
, 其次是 a
push
: 换一种说法, 2n 运营 /n
put
s 和 n
get
s/ 导致 2n
push
es 和 2n
pop
s. 因此,摊销成本一个
put
或者
get
等于一个
push
和一个
pop
.
请注意,由于摊销复杂性分析,群队列被称为这一队列 /和结合词汇 "amortized" 与金融/. 银行家的顶部 - 这是它曾经是常规面试问题的事实的答案,虽然我认为现在被认为太名:提出了一个在摊销中实现以下三项操作的队列 O /1/ 时间:
6 个回复
石油百科
赞同来自:
一个操作的累积成本,由操作顺序估计。
该想法是确保整个序列的总消耗,同时允许各个操作比摊销成本更昂贵。
例子
:
行为 C++
. 什么时候
增加上方向上的向量的大小,它使所选择的长度加倍。
因此,执行一个
可能需要
时间 /由于数组的内容被复制到新的内存分配。/.
但是,由于分配的大小加倍,以下是
称呼
每次都会执行
时代。 因此,总金额
操作仍然需要
会给的时候
摊销价值
用于操作。
除非另有说明,否则折旧的复杂性是任何操作序列的渐近最糟糕的保证。 它的意思是:
正如在不受移民复杂性的情况下,指定 big-O, 用于摊销复杂性,忽略固定初始初始开销和恒定性能系数。 因此,进行评估 big-O 摊销效率通常可以假设任何摊销操作序列都将是 "long enough" 摊销固定起始费用。 特别是,例如
你不需要担心你是否真的遇到过
额外的操作:分析的渐近性质已经假设您所做的事。
除了任意长度之外,摊销分析不会对操作顺序做出假设,您衡量的成本, - 这是最糟糕的保证
任何可能的序列
操作。 无论选择如何选择操作 /说,恶意对手!/, 摊销分析应确保足够长的操作顺序不能超过其摊销成本的总和。 这就是为什么 /除非特别指示为限定符/ "probability" 和 "average case" 与摊销分析无关,以及通常最糟糕的分析 big-O!
快网
赞同来自:
/从咒语等等, " 算法简介"/
它可以混淆一点,因为它说时间平均,并且这不是平均案例分析。 所以让我试着用金融类比解释它 /真的, "amortized"- 这是最常见于银行和会计的词。/
假设你开了彩票。 /当不购买彩票时,我们现在继续前进,并驾驶彩票本身。/ 你正在打字 100 000 卖的门票 1 每个货币单位。 其中一个门票将为买方提供权利 40 000 单位货币。
现在,假设您可以出售所有门票,您可以赚取 60 000 货币单位: 100 000 销售货币单位,减去奖品 40 000 单位货币。 对您来说,每张票的费用是 0.60 所有门票摊销的货币单位。 这是一个可靠的价值,您可以依赖它。 如果你厌倦了自己出售门票,有人来了,并提供出售它们 60 外币单位,您确切地知道您的位置。
对于彩票买家,情况是不同的。 买方有预期的损失 0.60 购买彩票票时的货币单位。 但它是概率的:买方每天都可以买十个彩票 30 年 /微微多一点 100 000 门票/, 永远不会赢。 或者他们可以自发地购买一张票并赢得胜利 39 999 单位货币。
关于数据结构的分析,我们正在谈论第一种情况,当我们贬值某些数据结构操作的成本时 /让我们说插入/ 对于这种方式的所有操作。 分析平均案例处理随机运营的预期成本 /说,搜索/, 在我们无法计算所有操作的总成本,但我们可以提供对一个操作的预期值的概率分析。
通常认为折旧分析适用于昂贵的操作罕见的情况,这通常是如此。 但不总是。 考虑,例如,所谓的 "银行家的线路", 哪个是队列 first-in-first-out /FIFO/, 由两个堆栈组成。 /这是一个经典的数据功能结构; 你可以建立廉价堆栈。 LIFO 从不可改变的单挂节点,但便宜 FIFOs 不太明显/. 操作如下执行:
现在我争辩说摊销成本
和
平等的
, 假设我开始和完成空白队列。 分析很简单:我总是放
在正确的堆栈中,
- 在左边。 因此,除了提案
, 每个
是一个
, 和每一个人
是一个
, 两者都是
. 我不知道我有多少次执行报价
- 这取决于模板
s 和
S-虽然我知道每个元素从右侧堆叠到左侧的一部分移动一次。 因此,整个序列的总成本 n
s 和 n
s 等于: n
es, n
s 和 n
s, 在哪里 a
-这是 a
, 其次是 a
: 换一种说法, 2n 运营 /n
s 和 n
s/ 导致 2n
es 和 2n
s. 因此,摊销成本一个
或者
等于一个
和一个
.
请注意,由于摊销复杂性分析,群队列被称为这一队列 /和结合词汇 "amortized" 与金融/. 银行家的顶部 - 这是它曾经是常规面试问题的事实的答案,虽然我认为现在被认为太名:提出了一个在摊销中实现以下三项操作的队列 O /1/ 时间:
1/ 获取并删除队列的最旧元素,
2/ 将新元素放在队列中
3/ 找到当前最大元素的值。
莫问
赞同来自:
插入 - 因为,虽然树平衡是非常复杂的,但它只发生一次 n 插入 /例如,插入数字时一次 256, 然后再在512号,1024th等。/. 对于所有其他插入物,复杂性相等 O/1/ - 是的,她需要 O/n/ 一旦每次 n 插入但它很可能
, - 因此,我们是乘法的 O/n/ 在 1/n 并得到 O /1/. 所以它被称为 "Amortized complexity of O/1/" - 因为当您添加更多元素时,所花费的树上花费的时间最小。
董宝中
赞同来自:
概念取决于存在足够数量的运行以分割总时间。 如果算法只开始一次,或者它必须在每次开始时在截止日期期间见面,那么最糟糕的复杂性就更相关。
郭文康
赞同来自:
对数组进行排序将 O /n logn/.
因此,找到k-e最小的数字是找到索引,所以 O/1/.
由于阵列已被排序,因此我们永远不必再次进行排序。 我们永远不会超过一次最糟糕的情景。
如果我们做 n 要求找到k-th最小的请求,它仍然是 O/n logn/, 因为他占主导地位 O/1/. 如果我们平均每次操作的时间,那将是:
/N Freemont,加利福尼亚州//N 或者 O/加利福尼亚州弗里雅蒙/. 所以,时间 Complexity/ 运营数量。
这是摊销复杂性。
我觉得它是这样的,我也只学到这一点..
董宝中
赞同来自: