繁体   English   中英

这种贪婪算法能更有效吗?

Can this greedy algorithm be more efficient?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在为即将上线的考试而学习,并且正在练习一个问题,希望我实施贪婪算法。

我得到了不同权重的未排序数组,其中所有i的0 <weight_i。 我必须全部放置,以使我使用最少数量的桩。 不能将两个重物放在一堆中,而顶部的重物大于下面的重物。 我还必须尊重权重的排序,因此必须按顺序放置它们。 堆没有高度限制。

例如:如果我的权重为{53,21,40,10,18},则我不能将40放在21上方,因为桩必须按降序排列;而我也不能将21放在40上方,因为那不遵守顺序。 最佳解决方案将具有桩1:53、21、10和桩2:40 18

我的一般解决方案是遍历数组,并始终选择允许重的第一堆。 我相信这将为我提供最佳解决方案(尽管我尚未证明)。 我找不到与此相反的例子。 但这将是O(n ^ 2),因为最坏的情况是我必须遍历每个元素和每个堆(我认为)

我的问题是,是否有办法将其降低到O(n)或O(nlogn)? 如果有,我只是没有看到它,需要一些帮助。

2 个回复

您的算法将给出正确的结果。

现在请注意以下几点:当按顺序访问堆并停在可以堆叠下一个值的第一个堆时,您总是会遇到这样的情况,即堆按其当前的最高(最后)值以升序排序。

您可以使用此属性来避免桩从“左到右”的迭代。 而是在堆中使用二进制搜索来查找可以采用下一个值的第一个堆。

这将使您的时间复杂度为O(nlogn)

信不信由你,您所描述的问题等同于计算最长的递增子序列的长度 关于为什么有一个整洁的贪婪的小想法。

考虑阵列中最长的递增子序列(LIS)。 因为元素在索引上同时在价值上也在上升,所以它们必须全部位于不同的堆中。 结果,所需的最小桩数等于LIS中的单元数。

使用动态编程和二进制搜索,LIS可以轻松地在O(NlogN)中求解。

请注意,您描述的算法与下面的算法具有相同的功能-它找到您可以放置​​该项目的第一堆(通过二进制搜索),或者创建一个新的堆,因此这可作为“正确性”的“证明”您的算法以及降低复杂性的方法。

dp[i]等于长度(i + 1)递增子序列结束时的最小值元素。 要根据您的问题重新构造, dp[i]也将等于ith堆上石头的重量。

from bisect import bisect_left
def lengthOfLIS(nums):

    arr = []

    for i in range(len(nums)):
        idx = bisect_left(arr, nums[i])
        if idx == len(arr):
            arr.append(nums[i])
        else:
            arr[idx] = nums[i]
    return len(arr)
1 如何使该算法更有效?

我有一个算法可以生成一个包含所有可能值之和的2D数组。 例如,对于数组[1,5,8,4,5] ,二维数组sums[1][3]应该返回原始数组(17)中索引1-3的总和。 我相信就大O而言,效率为O(N 2 )。 有什么办法可以使该算法更有效? ...

2 什么是超越贪婪算法的有效方法

这个问题的领域是在受限硬件上调度操作。 结果的分辨率是计划适合的时钟周期数。 搜索空间的增长非常迅速,早期的决策限制了未来的决策,而可能的时间表总数也呈指数级增长。 许多可能的时间表都是等效的,因为仅交换两个指令的顺序通常会导致相同的时序约束。 基本上,问题是在不花费太多时间的情况下 ...

3 我可以让这个算法更有效吗?

这是大学的作业。 我必须模拟 10 个随机掷骰子(在 1 - 6 之间)并将它们放在一个列表中,然后创建另一个列表,该列表将保留每个值的滚动次数。 我的输出必须是这样的: 这是我的代码结果: 它工作正常,但我想知道我是否可以使它更高效甚至简化它。 ...

4 PHP中更有效的算法

我在数据库中有12个图像链接,可以使用get_field('opt3_img_N')进行调用,其中N可以是1 -12之间的任何数字。 (我正在向熟悉的任何人使用wordpress)。 我遇到的麻烦是想出一种有效的方式来以我想要的方式输出图像。 我需要将链接平均分配到3个div中。 ...

5 更高效的排序算法?

我正在寻找一种比Arrays.sort()更好的Arrays.sort() 。 我知道这看起来像是一个万次问的愚蠢问题,但请继续阅读。 让我们有两个实现Comparable的类,它们的自然顺序基于int值。 第一个compareTo方法如下所示: 第二个是: 当我在这些 ...

6 更高效的compareTo算法?

我正在使用Collections.sort对对象的ArrayList进行排序,我想看看是否有更高效的compareTo方法用于我正在尝试的方法。 这是方法: 如果有人能提出更有效的方法(即更快的运行时间),我将非常感激。 ...

7 有没有更有效的搜索算法

我试图基于两个条件在R中将两个数据集合并在一起。 它们必须具有相同的ID和年份。 一个向量的大小约为10000,另一个向量的大小为2000。我认为,如果我一个接一个地进行两个级别的搜索,计算时间将会激增。 数据按ID和年份排序。 是否有比朴素的比较有效的搜索算法? ...

8 如何使该算法更有效地利用内存?

我已经在这两段代码上工作了几天,它似乎对于较小尺寸的搜索树也可以正常工作,但是使用较高的代码会产生分段错误。 我试图通过使用打印标志来查找此类错误的具体出处,它似乎在is_goal()函数处中断。 但是该函数的代码可以假定为正确的。 因此,问题似乎是内存问题,这就是为什么在堆中有队 ...

10 我如何才能更有效地对 Dijkstra 算法进行这种修改?

这个问题是我计算机科学作业的一部分。 作业包括 5 种不同类型的学生,他们穿越给定的加权无向节点图,其中每个学生都有不同的方法。 第五个学生是最难的一个,我没能有效地实施它。 第五个学生有一个秘密力量,他可以在相邻节点之间传送,因此它们之间的移动时间为0。 但是,要给那神秘力量充电,他需要通过 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM