在非营利组织的条款中摊销复杂性?

任何人都可以解释非专业条款的摊销复杂性吗? 我很难在互联网上找到一个准确的定义,我不知道如何与算法分析完全相关。 一切都很有用,即使它是指来自外部的,也会受到高度赞赏。
已邀请:

石油百科

赞同来自:

摊销复杂性 - 这是

一个操作的累积成本,由​​操作顺序估计。

该想法是确保整个序列的总消耗,同时允许各个操作比摊销成本更昂贵。

例子

:

行为 C++
std::vector<>

. 什么时候
push_back//

增加上方向上的向量的大小,它使所选择的长度加倍。

因此,执行一个
push_back//

可能需要
O/N/

时间 /由于数组的内容被复制到新的内存分配。/.

但是,由于分配的大小加倍,以下是
N-1

称呼
push_back//

每次都会执行
O/1/

时代。 因此,总金额
N

操作仍然需要
O/N/

会给的时候
push_back//

摊销价值
O/1/

用于操作。

除非另有说明,否则折旧的复杂性是任何操作序列的渐近最糟糕的保证。 它的意思是:

正如在不受移民复杂性的情况下,指定 big-O, 用于摊销复杂性,忽略固定初始初始开销和恒定性能系数。 因此,进行评估 big-O 摊销效率通常可以假设任何摊销操作序列都将是 "long enough" 摊销固定起始费用。 特别是,例如
std::vector<>

你不需要担心你是否真的遇到过
N

额外的操作:分析的渐近性质已经假设您所做的事。

除了任意长度之外,摊销分析不会对操作顺序做出假设,您衡量的成本, - 这是最糟糕的保证

任何可能的序列

操作。 无论选择如何选择操作 /说,恶意对手!/, 摊销分析应确保足够长的操作顺序不能超过其摊销成本的总和。 这就是为什么 /除非特别指示为限定符/ "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 不太明显/. 操作如下执行:


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/ 时间:

1/ 获取并删除队列的最旧元素,

2/ 将新元素放在队列中

3/ 找到当前最大元素的值。

莫问

赞同来自:

原则 "amortized complexity" 是,虽然当你这样做时,虽然有些东西可能是相当困难的,因为它不经常这样做,但它被认为是 "not complex". 例如,如果您创建二叉树,则从时间需要平衡 - 说,一次
2^n

插入 - 因为,虽然树平衡是非常复杂的,但它只发生一次 n 插入 /例如,插入数字时一次 256, 然后再在512号,1024th等。/. 对于所有其他插入物,复杂性相等 O/1/ - 是的,她需要 O/n/ 一旦每次 n 插入但它很可能
1/n

, - 因此,我们是乘法的 O/n/ 在 1/n 并得到 O /1/. 所以它被称为 "Amortized complexity of O/1/" - 因为当您添加更多元素时,所花费的树上花费的时间最小。

董宝中

赞同来自:

摊销手段分为重复的运行。 保证最严重的行为不需要以高频率发生。 例如,如果最慢的情况是/N/, 但这将发生的可能性是 O/1/N/,, 否则过程是平等的 O/1/, 然后算法仍将具有折旧的常量 O /1/ 时间。 想想每个人的工作 O/N/ 运行应分发到 N 其他运行。

概念取决于存在足够数量的运行以分割总时间。 如果算法只开始一次,或者它必须在每次开始时在截止日期期间见面,那么最糟糕的复杂性就更相关。

郭文康

赞同来自:

假设您正在尝试找到未排归数组的最小元素。
对数组进行排序将 O /n logn/.
因此,找到k-e最小的数字是找到索引,所以 O/1/.

由于阵列已被排序,因此我们永远不必再次进行排序。 我们永远不会超过一次最糟糕的情景。

如果我们做 n 要求找到k-th最小的请求,它仍然是 O/n logn/, 因为他占主导地位 O/1/. 如果我们平均每次操作的时间,那将是:

/N Freemont,加利福尼亚州//N 或者 O/加利福尼亚州弗里雅蒙/. 所以,时间 Complexity/ 运营数量。

这是摊销复杂性。

我觉得它是这样的,我也只学到这一点..

董宝中

赞同来自:

这有些类似于将算法的各种分支的最差复杂性乘以执行该分支的概率和添加结果的概率。 因此,如果某些分支不太可能,它对复杂性贡献较小的贡献。

要回复问题请先登录注册