Введение

Алгоритм Марзулло, разработанный Китом Марзулло для его докторской диссертации в 1984 году, — это алгоритм достижения согласия, используемый для выбора источников для оценки точного времени на основе нескольких зашумленных источников времени. Усовершенствованная версия этого алгоритма, переименованная в "алгоритм пересечения", входит в состав современного протокола сетевого времени (NTP). Алгоритм Марзулло также применяется для вычисления обобщенного пересечения n прямоугольников (или, в более общем случае, n подмножеств Rn), что необходимо для ряда устойчивых методов оценки множеств.

Цель

Алгоритм Марзулло эффективен по времени для получения оптимального значения из набора оценок с доверительными интервалами, в случае когда фактическое значение может выходить за пределы доверительного интервала для некоторых источников. В этом случае наилучшей оценкой считается наименьший интервал, согласованный с наибольшим числом источников. Например, если у нас есть оценки 10 ± 2, 12 ± 1 и 11 ± 1, то соответствующие интервалы будут [8, 12], [11, 13] и [10, 12], которые пересекаются, образуя [11, 12] или 11,5 ± 0,5, что согласуется со всеми тремя значениями. Если же интервалы будут [8, 12], [11, 13] и [14, 15], то интервала, согласованного со всеми этими значениями, не существует, но [11, 12] согласуется с наибольшим числом источников – а именно, с двумя из них. Наконец, если интервалы будут [8, 9], [8, 12] и [10, 12], то оба интервала [8, 9] и [10, 12] согласуются с наибольшим числом источников. Эта процедура определяет интервал. Если требуется получить наилучшее значение из этого интервала, то наивный подход заключается в принятии центра интервала в качестве значения, что и было предусмотрено в оригинальном алгоритме Марзулло. Более сложный подход учитывает, что это может приводить к потере полезной информации из доверительных интервалов источников, и вероятностная модель источников может вернуть значение, отличное от центра. Следует отметить, что вычисленное значение, вероятно, лучше описывать как «оптимистичное», а не «оптимальное». Например, рассмотрим три интервала [10, 12], [11, 13] и [11,99, 13]. Алгоритм, описанный ниже, вычислит [11,99, 12] или 11,995 ± 0,005, что является очень точным значением. Если мы подозреваем, что одна из оценок может быть неверной, то как минимум две оценки должны быть правильными. При этом условии наилучшей оценкой будет [11, 13], поскольку это самый большой интервал, который всегда пересекается как минимум с двумя оценками. Алгоритм, описанный ниже, легко параметризуется максимальным числом неверных оценок.

Эффективность

Алгоритм Марзулло эффективен как по объему используемой памяти, так и по времени выполнения. Асимптотический объем используемой памяти составляет O(n), где n — количество источников. При анализе асимптотической временной сложности алгоритм можно разбить на этапы: построение таблицы, ее сортировку и поиск по ней. Сортировка может быть выполнена за время O(n log n), что является доминирующей операцией по сравнению с построением таблицы и поиском, которые могут быть выполнены за линейное время. Следовательно, временная эффективность алгоритма Марзулло составляет O(n log n). После построения и сортировки таблицы обновление интервала для одного источника (при получении новой информации) возможно за линейное время. Таким образом, обновление данных для одного источника и поиск оптимального интервала могут быть выполнены за время O(n).