2013-02-26 4 views
4

Эта проблема в основном является проблемой оптимизации алгоритма.Найти номер, ближайший ко всем числам в массиве

У нас есть список, содержащий n элементов. например. {n1,n2,n3...nk} Этот список сортируется, и мы должны выяснить, число Ni, который

  1. n1<=ni<=nk
  2. Сумма расстояния ni от каждого номера минимальна.

Там может быть полным (nk-n1+1) возможных номеров, но наша цель состоит в том, чтобы узнать номер ni, который ближайших ко всем другим номерам.

Подход с грубой силой может быть переименован через n1 в nk и рассчитать сумму дистанций из всех номеров. Таким образом, мы можем легко найти число, которое ближе всего ко всем другим номерам в списке.

Но проблема с этим подходом заключается в том, что это не хорошо с точки зрения сложности времени. Сложность этого подхода составляет O(n^2).

Я думаю, что может быть лучший способ сделать это, что может решить эту проблему за меньшее время сложность.

Любой подход будет оценен.

+0

Какое определение «расстояние» вы используете? –

+0

Как насчет поиска с бинарным поиском, потому что вы упомянули, что список отсортирован? – kamaci

+0

да расстояние (a, b) = abs (ab) – vicky

ответ

6

Если по расстоянию вы имеете в виду distance(a,b) = abs(a-b), тогда вам просто нужно найти медианную.

Поиск медианы в отсортированном списке - O (1).

+0

вы могли бы означать «medoid» (его значение совпадает с медианным в 1d случае для данного определения расстояния ('abs (ab)'), если имеется нечетное число элементов). – jfs

+0

@ Себастиан: Да, я знаю. Если есть четное число элементов, то обе или обе медоиды будут делать. –

+0

Да, если есть четное количество элементов. то ближайшее число должно быть среднее из двух средних чисел. если b1 и b2 - два средних числа, то ближайшее число должно быть (b1 + b2)/2. – vicky

0

Найти среднее ... это занимает O (n). Затем пройдите по списку, чтобы найти ni для среднего (также принимает O (n)) ... на самом деле больше похоже на o (1/2n)

Смежные вопросы