让我们说1900年至2000年间,我有100多人的出生和死亡年数。
ergo:
人[0] [出生] = 1900;
人[0] [死亡] = 1960;
人[99] [出生] = 1904;
人[99] [死亡] = 1982;
我想找到大多数人生活在这些范围之间的那一年。
显而易见的方法是通过每个人,计算他所居住的年数(死亡 - 分娩),并使用内循环将这些年份添加到累积数组中。运行时间为O(n ^ 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年,有两个人住。在......