让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)
时间,这对于大尺寸阵列是不可行的。
答案 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
)时,您会发现4
是12
间隔中的最大值。它还会累加{1, 4, 3}
个时间间隔4
为最大值。
如果您使用朴素的方法在子阵列中找到最大值({{1} }})。但是,使用segment trees,您应该能够在(一次)构造段树(4
)之后将子阵列中的最大值查找减少到16
操作。在构建分段树之后,最坏的情况是4
并且平均O(N log N)
。在最坏的情况下,计数主导了复杂性,因此它O(N^2)
并且平均而言,分段树的构建占主导地位,因此它是O(N)
。