Блог пользователя slalex

Автор slalex, 14 лет назад, По-русски
Всем Привет!

Попалась недавно задачка, к которой не могу подобрать алгоритм. ((
Когда уже мысли кончились, решил погуглить, но решения так и не обнаружил... хотя в некоторых статьях пишут, что оно существует ))

Задача такова, что необходимо найти медиану массива (неотсортированного конечно же).
Т.е. такое значение, которое после сортировки массива A[1...n]  будет равно:
элементу A[n / 2 + 1], при нечетном n и (A[n / 2] + A[n / 2 + 1]) / 2.0, при четном n.

НО.... самое интересное, что алгоритм должен быть линейным... 8)
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Не вот это случайно?
http://e-maxx.ru/algo/kth_order_statistics
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Видел этот алгоритм... но он в среднем работает за линейное время O(N). А хотелось бы узнать, чтобы в худшем работал за O(N).
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Похожая задача с тимуса.
Я решал через  heap за NLogN
Считываем n/2+2 чисел.
Потом на каждом шаге добавляем текущее число и удаляем из heap самое большое из имеющихся.
Ответом будет либо 2 элемента, которые лежат на вершине или один в зависимости от чётности N.
Полностью линейное решение использует 2 прохода по входным данным.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Эту задачу тоже решал и таким же алгоритмом...
    И как реализовать полностью линейное решение в 2 прохода?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Про линейный алгоритм можно почитать тут
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Еще линейный алгоритм описан в Кормэне.
»
11 лет назад, # |
  Проголосовать: нравится -11 Проголосовать: не нравится