Можно решить задачу two closest points на линии за O(n)? каким-нибудь хитрым рандомизированным алгоритмом, к примеру?
Т.е. просто даны n чисел и нужно найти два ближайших по модулю
n раз выбираем случайную пару чисел. Получили n расстояний, из них выбираем наименьшее, обозначим за B.
Далее делим числа на блоки. В один блок дают числа, дающие одинаковое частное от деления на B (ну то есть мы сделали сеточку с шагом B и пронумеровали ячейки).
Дальше каждый блок сортируем, ну и теперь понятно как считать ответ.
У этого алгоритма линейное матожидание вроде