千里马计数

时间:2015-08-10 06:33:20

标签: algorithm max

DefaultTableCellRenderer

有10个连续的子阵列。让我考虑所有这些子阵列的最大值。

A = {4, 1, 3, 2}

所以:

  Sub array   Max 

{4}            4
{1}            1
{3}            3
{2}            2
{4, 1}         4
{1, 3}         3
{3, 2}         3
{4, 1, 3}      4
{1, 3, 2}      3
{4, 1, 3, 2}   4

问题:是否有任何方法可以在Max # Occurrences 1 1 2 1 3 4 4 4 时间内计算此类事件的发生次数?使用dequeue我可以找到所有间隔的最大值,但是需要O(n)时间,这对于大尺寸阵列是不可行的。

1 个答案:

答案 0 :(得分:3)

算法将首先找到全局最大值(s),这些最大值在它们所处的所有间隔中最大(计算它们应该是O(N),多个全局最大值会使复杂性复杂化一点虽然)。然后你知道,对于超出或包括全局最大值的intervall,其他最大值不会是最大值,因此你可以将问题拆分成子数组。

例如,对于您的数组,您首先会发现4是数组的最大值,因此它是从0开始或以{0}结束的所有子数组的最大值。在0之后,即4。然后,您将获得前面和后面的子阵列{}{1, 3, 2}。然后你继续检查{1, 3, 2}(我们跳过空的,因为它是微不足道的)3是最大值,它是它所在的所有子阵列的最大值,即那些从1开始或在1之后或之后开始的那些,有四个这样的(2*2),然后它继续子阵列{1}和{{1 }}

还必须考虑我们遇到多个最大值的复杂情况。例如,如果我们在数组{2}处找到两个最大值(两个四个),则同样适用于此处第一个{1, 4, 3, 4, 3, 2}对于它所属的所有区间最大(这里是4),第二个是10中的最大值,但要注意这些间隔中的一些是相同的,你必须决定如何计算它们(见下文)。现在同样适用于其他数字只能在12不在的子数组中最大值,因此我们最终需要考虑3个子数组,即4{1}和{{ 1}}。

当你在一个区间内有多个最大值时,它不会像你想要计算的那样非模糊。例如,在{3}区间内,{3, 2}在区间{4, 3, 4}(第一个),4(第二个),{4},{{ 1}}和{4}。除了最新的一切都是非常直接的,有一个,但你想如何计算最后一个?那么它是一个间隔,所以它是一个,但你也可以决定计算两次。根据算法分析数组时,最终会使{4, 3}个区间中的第一个最大,{3, 4}个区间中的第二个加起来为{4, 3, 4},这对应于你计算最​​后一个间隔两次的情况(因为它有两个3 s)。

另一方面,如果您只想计算一次间隔,则可以使用子阵列计算它们。首先构造包含每个子区间的最大子区间和包含它们的最大子区间。例如,在数组3中,您首先拥有从第一个6之前或之后开始的子数组,并在第一个4之后或之后结束,但在第二个之前(这意味着您得到{1, 4, 3, 4, 3, 2} 1}} interval),然后你做相应的第二个,这意味着从第二个4开始或在第一个4之前但在第一个4之后或之后结束的间隔(这意味着你得到{ {1}}间隔),最后你计算它们包含两个,即在第一个4之前或之前开始并在第二个之后或之后结束的间隔(这给出4个间隔)。当我们总结时,我们以6间隔结束。

另一个解决方案是选择4中的一个作为最大值,然后处理相应子阵列中的剩余6。在这个例子中,人们可能会选择第二个,因为它是最中间的16。这将导致计算4间隔,然后当您处理左子区间(4)时,您会发现412间隔中的最大值。它还会累加{1, 4, 3}个时间间隔4为最大值。

如果您使用朴素的方法在子阵列中找到最大值({{1} }})。但是,使用segment trees,您应该能够在(一次)构造段树(4)之后将子阵列中的最大值查找减少到16操作。在构建分段树之后,最坏的情况是4并且平均O(N log N)。在最坏的情况下,计数主导了复杂性,因此它O(N^2)并且平均而言,分段树的构建占主导地位,因此它是O(N)

相关问题