Учитывая P = {p 1,..., p n} разных точек, которые определяют n 2 напишите алгоритм который находит линию, которая имеет самый низкий угол (наименьшее абсолютное значение) с O (n lgn) наихудшей сложностью.
Находя самый низкий наклон n ^ 2 линий
Ответ 1
Отсортируйте точки в зависимости от их позиции y (n log n time, используя любое количество известных алгоритмов). Пройдите список по порядку, от 0 до n - 1, сравнивая склоны каждой пары точек с тем, что вы обнаружили, является самым низким наклоном. (это n времени).
В целом, это будет O (n log n).
В псевдокоде:
Let P be the list of points (this list starts at 1)
n = P.length
S = quicksort("a.y < b.y", P) // or some other O(n log n) algorithm
bestSlope = float.inf
let p1 and p2 be points
for i = 1 to n-1:
currSlope = abs((P[i].y - P[i+1].y) / (P[i].x - P[i+1].x))
if currSlope < bestSlope:
bestSlope = currSlope
p1 = P[i]
p2 = P[i+1]
Ответ 2
Теорема:
- Учитывая множество точек P.
- Выберите две точки A и C в P такие, что линия AC имеет наименьший абсолютный наклон (как определено в вопросе).
- Для вырожденного случая, когда несколько пар точек имеют один и тот же наклон, пусть AC - самый короткий отрезок линии с этим уклоном.
- Тогда в P нет других точек с Y-координатой между A и C.
Доказательство (от противного):
- Предположим, что существует хотя бы одна другая точка, B, чья координата Y находится между A и C.
- Тогда существуют три возможных случая:
- B является колинейным с A и C. Тогда линии AB или BC имеют тот же наклон, что и AC, но оба они короче AC. Противоречие.
- B попадает в полуплоскость "выше" AC. Тогда линия AB имеет более низкий наклон, чем AC. Противоречие.
- B попадает в полуплоскость "ниже" AC. Тогда линия BC имеет более низкий наклон, чем AC. Противоречие.
- Все случаи приводят к противоречию, поэтому между A и C не возникает точек.
- QED.
С помощью этой теоремы вы можете четко использовать алгоритм @Zshazz для поиска правильной пары - потому что они будут ближайшими соседями - в O(n*log n)
.