algorithm - 从算法中导出成本函数并证明其复杂度为 O(...)
问题描述
当计算每个操作的算法成本为 1 时,当while
循环依赖于多个变量时,它会变得混乱。此伪代码将一个元素插入到堆的正确位置。
input: H[k] // An array of size k, storing a heap
e // an element to insert
s // last element in array (s < k - 1)
output: Array H, e is inserted into H in the right place
s = s+1 [2]
H[s] = e [3]
while s > 1: ]
t=s/2 ][3]
if H[s] < H[t] ][3]
tmp = H[s] ][3]
H[s] = H[t] ][3]
H[t] = tmp ][3]
s = t ][2]
else
break ][1]
return H
就 f(n) 而言,成本函数是多少?和大O复杂性?
解决方案
我承认,我最初对您的伪代码的缩进感到困惑。在MK 的评论提示后,我重新缩进了您的代码,并理解了您对多个变量的含义。
提示:如果s等于2 k,循环将迭代k次,最坏的情况。预期平均值为k/2次迭代。
k/2的原因是在没有任何其他信息的情况下,我们假设输入e有相同的机会成为数组当前最小值和最大值之间的任何值。如果您知道分布,那么您可以相应地调整预期平均值。但是,通常情况下,预期平均值将是k的常数因子,因此不会影响大O。
设n为堆中元素的数量。因此,成本函数f(n)表示大小为n的堆的函数成本。while 循环之外的函数成本是常数C 1,因此f(n)由 while 循环本身g(n)支配。循环每次迭代的成本也是常数C 2,因此成本取决于迭代次数。所以:f(n) = C 1 + g(n+1)。并且g(n) = C 2 + g(n/2). 现在,您可以求解g(n)的特征方程。请注意,g(1)为 0,g(2)为C 2。
所呈现的算法使用交换将元素冒泡到正确的位置。为了使内部循环更有效(它不会改变复杂性,请注意),内部循环可以表现得更像插入排序的行为,并且仅在末尾将元素放置在正确的位置。
s = s+1
while s > 1 and e < H[s/2]:
H[s] = H[s/2];
s = s/2;
H[s] = e;
推荐阅读
- homebrew - 错误:google-backup-and-sync:似乎已经有一个应用程序
- node.js - 节点找不到自定义类的模块
- python - 调试python代码以检索rest api访问令牌
- excel - 需要修复一个excel单元格,但是当我复制并粘贴下面的行时,固定单元格应该改变
- python - 使用 .loc 不一致地切片列
- smtp - BizTalk SMTP 消息“msg_Email”的“PartAttachment”部分在构造块的末尾包含空值
- mysql - 如何使用特定规则将 TOP 3 值选择到 3 列?
- json - JSON 模式不验证缺少的属性
- java - 为什么 Eclipse 中的 Codota 插件不起作用?
- c - fopen 读取无效的参数 C