Я решил эту проблему с требованием памяти O(n+m)
[в худшем случае, в лучшем случае O(n)
]
и со сложностью времени O(n logn)
.
Здесь, n & m
- это длина массивов births
и deaths
.
Я не знаю PHP или javascript. Я реализовал это с Java, и лог c очень прост. Но я верю, что моя идея может быть реализована и на этих языках.
Подробности техники:
Я использовал структуру java TreeMap
для хранения записей о рождении и смерти .
TreeMap
вставляет данные отсортировано ( на основе ключа ) в виде пары (ключ, значение), здесь ключ - год и значение это совокупная сумма рождений и смертей (отрицательная для смертей).
Нам не нужно , чтобы вставить значение смертей, которое произошло после наивысшего года рождения.
После заполнения TreeMap с рождениями и записи о смертях, все кумулятивные суммы обновляются и хранят максимальную численность населения с годами, по мере его развития.
Пример ввода и вывода: 1
Births: [1909, 1919, 1904, 1911, 1908, 1908, 1903, 1901, 1914, 1911, 1900, 1919, 1900, 1908, 1906]
Deaths: [1910, 1911, 1912, 1911, 1914, 1914, 1913, 1915, 1914, 1915]
Year counts Births: {1900=2, 1901=1, 1903=1, 1904=1, 1906=1, 1908=3, 1909=1, 1911=2, 1914=1, 1919=2}
Year counts Birth-Deaths combined: {1900=2, 1901=1, 1903=1, 1904=1, 1906=1, 1908=3, 1909=1, 1910=-1, 1911=0, 1912=-1, 1913=-1, 1914=-2, 1915=-2, 1919=2}
Yearwise population: {1900=2, 1901=3, 1903=4, 1904=5, 1906=6, 1908=9, 1909=10, 1910=9, 1911=9, 1912=8, 1913=7, 1914=5, 1915=3, 1919=5}
maxPopulation: 10
yearOfMaxPopulation: 1909
Пример ввода и вывода: 2
Births: [1906, 1901, 1911, 1902, 1905, 1911, 1902, 1905, 1910, 1912, 1900, 1900, 1904, 1913, 1904]
Deaths: [1917, 1908, 1918, 1915, 1907, 1907, 1917, 1917, 1912, 1913, 1905, 1914]
Year counts Births: {1900=2, 1901=1, 1902=2, 1904=2, 1905=2, 1906=1, 1910=1, 1911=2, 1912=1, 1913=1}
Year counts Birth-Deaths combined: {1900=2, 1901=1, 1902=2, 1904=2, 1905=1, 1906=1, 1907=-2, 1908=-1, 1910=1, 1911=2, 1912=0, 1913=0}
Yearwise population: {1900=2, 1901=3, 1902=5, 1904=7, 1905=8, 1906=9, 1907=7, 1908=6, 1910=7, 1911=9, 1912=9, 1913=9}
maxPopulation: 9
yearOfMaxPopulation: 1906
Здесь, смерти произошли (1914 & later
) после последнего года рождения 1913
, вообще не учитывались, что позволяет избежать ненужных вычислений.
В общей сложности 10 million
данных (совокупность рождений и смертей) и более 1000 years range
, программе потребовалось около 3 sec.
до финиша sh.
Если данные одинакового размера с 100 years range
, потребовалось 1.3 sec
.
Все входы выбираются случайным образом.