当前位置: 首页 > 知识库问答 >
问题:

无法定义此算法的运行时

许马鲁
2023-03-14

我这里有一个算法。

点击这里查看算法图像

它的作用是遍历一个数组并找到3个最大值并返回它们的总和。例如,数组[1,2,3,4,5]将返回12(3 4 5=12)。

图像中的算法说它是O(nlogk)。但这是我无法理解的。

以下是我对图像中第一个循环的看法:

Heap的方法“插入()”和“删除()”,它们都取O(logn)。所以在first for循环中,它通过添加它们的运行时来生成O(2*logn),简单地说就是O(logn)。由于first for循环对数组中的所有元素进行迭代,因此first for循环的总运行时间为O(nlogn)。

以下是我对图像中第二个同时循环的看法:

从上一个for循环中,我们删除了一些最小值ifh.size()

因此,我们有来自第一个for循环的O(nlogn),以及来自第二个while循环的O(klogn)。很明显,O(nlogn)大于O(klogn),因为k是某个常数。因此,该算法最终为O(nlogn)。

但答案是“O(nlogk)”而不是“O(nlogn)”。

您能解释一下原因吗?

共有2个答案

薛扬
2023-03-14

您关于insert()和deletemin()运行时取O(logn)的假设是不正确的。O(logn)中的'n'表示堆中的元素数。在这种情况下,它是k。

因此,对于第一个循环-每个元素都有O(2*logk),总计将有O(nlogk)和第二个循环-O(klogk)总复杂度可以定义为O(n*logk)

胡浩瀚
2023-03-14

堆上的操作采用 O(log(size_of_heap)))。如果此算法,堆大小为 k(不包括前几次迭代)。

所以我们得到<code>O(元素的总数_number_log(大小_of_heap))=O(n*log(k))。

 类似资料:
  • 我被要求为这个问题编写一个算法:给我们一个数组A,我们想知道数组中是否有两个元素U和L,U和L=K 我是这样写我的算法的: 但问题是,这个算法的运行时间是多少?它是O(nlogn)吗?如果是,为什么?如果不是,我如何在O(nlogn)中实现它?

  • 我正试图设置一个非常基本的闪回工作。当我尝试运行时,得到以下错误: 错误由以下代码引起: 当我向流的末尾添加调用时,错误消失了: 我不明白为什么可以解决这个问题。在引入接收器之前,流拓扑不会处理其任何操作符吗?

  • 不知道这个名字是不是很能说明问题,但还是来了。 我正在与一个需要继承基类和定义许多纯虚方法的API接口。 为了良好的编程实践,我希望在不同的(子)类中定义这些方法。 目前,我使用一个facade/包装器(两者兼而有之)类,它继承基类,实例化子类,并调用这些实例化类的必要方法: 有没有方法在这个facade/包装器中实例化的子类中实现纯虚拟函数?或者,对于这样的事情,什么是好的做法?我想要类似的东西

  • 我安装了wsl(Linux的Windows子系统),上面有ubuntu和jupyter笔记本。当我运行我的jupyternote手册时,我收到了这个错误消息。你能给我一些建议吗?非常感谢! Start:由于以下错误,无法运行此命令:系统找不到指定的文件。第1行字符:1 Start "file:///home/purit/.local/share/jupyter/runtime/nbserver-2

  • 我认为这段代码是(logn)^2,因为每个findindex函数都需要logn深度,我们称之为logn时间?有人能证实这一点吗?我希望你们中的一个能把这当成一个小测验,帮我一下。 给定一个已旋转未知次数的n个整数的排序数组,编写代码在数组中查找一个元素。您可能假设数组最初是按递增顺序排序的。

  • 我对iPad上的方向有一个问题。我禁用了iPhone上的方向,但我可以在某些特定的控制器上以编程方式更改它。但在iPad上我不能。我不知道为什么,尽管我在这个网站上搜索,一些开发人员编写答案以检查,我这样做了。但它禁用了所有屏幕上的方向。有没有办法在iPad上的特定控制器上提供更改方向的能力? 下面的代码我用来改变iPad的方向,但它不起作用。 提前感谢