Като се има предвид група от n точки, които се разпространяват на 3 хоризонтални линии (y = 0, y = 1, y = 2) помислете за алгоритъм, за да откриете дали има пресичаща линия с O (n ^ 2)
въведете описанието на изображението тук
Отговори:
0 за отговор № 1Вярвам, че този алгоритъм в O (n ^ 2). Първо предполагаме:
- Най-
x
- координира точките на линиятаy=2
може да бъде представен от ограничен брой битове. - Че тези x-координати са първоначално сортирани в
x
, Ако не, тогава сортирането им първо е O (nlog (n)) - Дефиницията на пресечната линия се прави по отношение на точността на представяне на точките с крайния брой битове.
Сега конструирайте функция хеш, както следва:
- Намерете минималното разстояние между съседни точки на линията
y=2
, Тъй катоx
Координатите се сортират, това е O (n). Обадете се на това минимално разстояниеd
. - Хеш функцията е пода (2 * х / г). Ясно е, че този хеш ще начертае всяка точка
y=2
до уникален контейнер. Тази операция е също O (n).
След това направете следното:
- За всяка двойка точки по линиите
y=0
иy=1
, изчислява се пресичаy=2
, Това е О (n ^ 2). - За всяка точка на пресичане
y=2
, търсенето на таблицата хеш, за да видите дали има точка от линиятаy=2
там. Ако има, вижте дали то е същата точка (с точност на машината) и ако е така, тогава има пресечна линия. В противен случай, няма. Това е O (n ^ 2), тъй като търсенето на хеш е O (1).
Следователно алгоритъмът е О (n ^ 2). Няма код, просто идеи.