Я столкнулся с этой загадкой
вопросом[ связанным со структурой данных
] на соревнованиях по программированию.
Существует планета деревьев (настоящие деревья, а не древовидная структура данных!!). Там миллиарды или даже триллионы деревьев. Король приказывает найти средний возраст (в годах и целых числах) всех деревьев, используя, скажем, углеродный анализ. ( Метод не имеет значения.
)
Примечание. Медиана — это «среднее число» в отсортированном списке чисел.
Ограничения:
1.
Известно, что самому старому дереву 2000 лет.
2.
У них есть единственная машина, которая может хранить целые числа в диапазоне от -бесконечности до +бесконечности.
3.
Но количество таких целых чисел, которые могут храниться в памяти за раз, равно 1 миллиону.
Итак, как только вы сохраните 1 миллион целых чисел для хранения следующего, вы должны удалить уже сохраненное.
Так что каким-то образом они должны отслеживать медиану, продолжая считать возраст деревьев.
Как они могут это сделать?
Мой подход
Используйте вариант внешней сортировки для сортировки возрастов по частям и записи их в файл.
Примените k-way слияние [для фрагментов].
Проблема с описанным выше подходом заключается в том, что для этого требуется два сканирования файла.
Я могу придумать другой подход, который использует информацию Известно, что самому старому дереву 2000 лет.
Нельзя ли взять числовой массив
[ так как диапазон возрастов дерева фиксирован
]?
Я хочу знать, есть ли лучший подход?
Существует ли способ, при котором нам не нужно хранить данные в файле?[ где достаточно только оперативной памяти?
]