algorithm - 从算法中导出成本函数并证明其复杂度为 O(...)

标签 algorithm

当计算每个操作的算法成本为 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),成本函数是多少?以及 Big O 复杂性?

最佳答案

我承认,最初我对您的伪代码的缩进感到困惑。在被 M.K's comment 提示后,我重新缩进了您的代码,并理解您关于多个变量的意思。

提示:如果s等于2k,循环将迭代k次,最坏的情况.预期平均值是 k/2 次迭代。

k/2 的原因是没有任何其他信息,我们假设输入 e 有相等的机会是当前最小值和最大值之间的任何值大批。如果您知道分布,则可以相应地调整预期平均值。不过,通常预期平均值是 k 的常数因子,因此不会影响 big-O

n 为堆中元素的数量。因此,成本函数 f(n) 表示函数对大小为 n 的堆的成本。 while 循环之外的函数成本是常量 C1,因此 f(n) 由 while 循环本身支配,< em>g(n)。循环每次迭代的成本也是常数 C2,因此成本取决于迭代次数。所以:f(n) = C1 + g(n+1)g(n) = C2 + g(n/2)。现在,您可以求解 g(n) 的特征方程。请注意,g(1) 为 0,g(2)C2

所提供的算法使用交换将元素冒泡到正确的位置。为了使内部循环更高效(请注意,它不会改变复杂性),内部循环的行为可以更像插入排序的行为,并且仅在末尾将元素放在正确的位置。

s = s+1
while s > 1 and e < H[s/2]:
   H[s] = H[s/2];
   s = s/2;
H[s] = e;

关于algorithm - 从算法中导出成本函数并证明其复杂度为 O(...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54471385/

相关文章:

C: 返回正确的值,但分配错误的值:-1.#IND000000000000

ios - - iOS : Make a tree based on a JSON

c# - 寻找列表中元素的最佳位置

algorithm - 多次翻转整行或整列后得到最少的硬币反面数

algorithm - 主要区别 - 顺序搜索算法

algorithm - 给定假期和假期如何最大化假期天数?

java - C 中的埃及分数

algorithm - 使用 DFS Kosaraju 查找 SCC 的最差运行时间

php - 将可变长度 URL 映射到数字 (0...3) 的简单哈希函数

java - 在 map 中搜索耗时过长的广度优先搜索策略