Вступление
Расстояние Хаусдорфа измеряет разницу между двумя подмножествами метрического пространства. Интуитивно понятно, что метрическое пространство - это просто некоторый набор со встроенной функцией расстояния; В этой задаче мы будем использовать натуральные числа с обычным расстоянием d(a, b) := abs(a - b)
. Хаусдорфово расстояние между двумя непустыми конечными множествами A
и B
определяется как
max(max(min(d(a, b) for b in B) for a in A),
max(min(d(a, b) for a in A) for b in B))
в Python-подобных обозначениях. Расстояние Хаусдорфа можно вычислить, найдя элемент, A
для которого расстояние до ближайшего элемента B
является максимальным, и элемент, B
для которого расстояние до ближайшего элемента A
является максимальным, и затем взяв максимум этих расстояний. Другими словами, если расстояние Хаусдорфа равно d
, то каждый элемент A
находится в пределах расстояния d
некоторого элемента B
, и наоборот.
вход
Ваш ввод представляет собой единый список целых чисел. Он содержит только элементы 0,1,2,3
, которые указывают, является ли данный индекс списка элементом ни, A
ни B
, только A
, только B
, или и то, A
и другое B
. Например, ввод [0,1,1,0,2,3]
означает, что A = {1,2,5}
и B = {4,5}
, если мы используем индексацию на основе 0 (что не имеет значения, поскольку наши метрики являются инвариантными для перевода).
Выход
Ваш вывод - расстояние Хаусдорфа между A
и B
; в приведенном выше примере это так 3
. Если любой набор пуст, то расстояние не определено, и вы должны вернуться -1
.
правила
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Тестовые случаи
[] -> -1
[0] -> -1
[0,1,0] -> -1
[2,0,0,2] -> -1
[0,1,2,3] -> 1
[0,3,3,0,0,0,0,3] -> 0
[1,0,0,1,0,0,1,3,1] -> 7
[1,0,0,0,0,3,0,0,0,0,2] -> 5
[0,1,1,3,1,3,2,1,1,3,0,3] -> 2
[2,2,2,1,2,0,3,1,3,1,0,3] -> 3
[1,3,0,2,0,2,2,1,0,3,2,1,1,2,2] -> 2
[1,0,1,1,2,0,1,2,3,1,0,0,0,1,2,0] -> 4
A
очень близок к одному из B
, но есть элементы B
очень далеки от него A
(например, если A
есть подмножество B
). В этом случае краткая формула неверна.
max(max(min(d(a, b) for b in B) for a in A))
должно быть достаточно. Это потому, чтоd(a,b)
возвращает абсолютное значение, и, следовательно, обе функции max будут возвращать одно и то же число каждый раз.