在范围数组中查找最大值

时间:2016-05-17 11:24:07

标签: performance runtime

让我们说1900年至2000年间,我有100多人的出生和死亡年数。

ergo:

人[0] [出生] = 1900;

人[0] [死亡] = 1960;

人[99] [出生] = 1904;

人[99] [死亡] = 1982;

我想找到大多数人生活在这些范围之间的那一年。

显而易见的方法是通过每个人,计算他所居住的年数(死亡 - 分娩),并使用内循环将这些年份添加到累积数组中。运行时间为O(n ^ 2)。

有更有效的方法吗?

2 个答案:

答案 0 :(得分:1)

O符号有时可能会有点误导。您没有一个变量。人数是n。生命的长度为y,整个间隔为Y。精确评估您的解决方案不是O(n^2),而是O(MAX(n*y, Y))。如果你说,Y是100并且总是如此,你的解决方案是O(n),因为y<=Y并且它们都被作为常量消除。你用两倍的人做两倍的工作,所以它确实是线性的,只是常量很高。严格来说标记O(n^2)意味着,生命的长度与人数成正比,这可能是无稽之谈。让我们说,从现在开始,y等于Y。现在,您的解决方案已简化为O(n*y)

您可以改进您的算法。将出生时的+1和死亡的-1存储到累积数组中。每个人只有两个值。现在,您可以通过该阵列一次,每年都能获得许多人。时间是O(MAX(n, y))。当n*log(n)增长速度超过y时,它优于@Aziuth的解决方案,但更糟糕的是。

答案 1 :(得分:0)

创建一个存储一对数据([出生或死亡],年份)的数组。每个人都会创建两组这样的数据。这需要O(n)。

按年份对此数组进行排序。这需要O(nlogn)。

处理该数组并使当前人数保持在变量中,相应地减少和增加。将最大金额存储到该点。这又需要O(n)。

实施例: A:1904年出生,1960年去世.B:1930年出生,1960年去世.C:1940年出生,1950年去世。

- &GT;一系列的死亡和分娩始于(出生,1904年),(死亡,1960年),......

- &GT;阵列排序:(出生,1904年),(出生,1930年),(出生于1940年),(死亡,1950年),(死亡,1960年),(死亡,1960年)

- &GT;处理阵列:1904年,一个人住。 1930年,有两个人住。在......