Интересный алгоритм

Discussion in 'WASM.HEAP' started by MaXF, Jan 15, 2007.

  1. MaXF

    MaXF New Member

    Blog Posts:
    0
    Подскажите, как среди 2n+1 различных по массе монет найти среднюю(т. е. такую, которая тяжелее n монет и легче других n монет), за 100n взвешиваний на чашечных весах без гирь.
     
  2. Kozyr__

    Kozyr__ New Member

    Blog Posts:
    0
    [сообщение мимо кассы]
     
  3. Black_mirror

    Black_mirror Active Member

    Blog Posts:
    0
    Пронумеруем все монеты.
    Очевидно что искомая монета может иметь любой номер.
    А среди оставшихся 2N монет N весят менее искомой.
    Всего (2n+1)*(2n)!/n! вариантов.
    При каждом взвешивание в худшем случае из них мы сможем отбрасывать не более половины вариантов.
    То есть должно выполняться неравенство:
    (2n+1)*(2n)!/n! < 2^(100n)
    Заменим 2n! и n! по формуле Стирлинга:
    (2n+1)*(2n/e)^2n*sqrt(2*pi*2n)/((n/e)^n*sqrt(2*pi*n)) < 2^(100n)
    Вычислим натуральный логарифм от обеих частей:
    ln(2n+1)+2n*ln(2n/e)+ln(sqrt(2*pi*2n))-n*ln(n/e)-ln(sqrt(2*pi*n)) < 100n*ln(2)
    ln(2n+1)+2n*ln(2n)-2n+ln(sqrt(2*pi*2n))-n*ln(n)+n-ln(sqrt(2*pi*n)) < 100n*ln(2)
    Всё что со знаком минус перенесём в правую часть:
    ln(2n+1)+2n*ln(2n)+ln(sqrt(2*pi*2n)) < 100n*ln(2)+n+n*ln(n)+ln(sqrt(2*pi*n))
    n*2*ln(2n)+ln(2n+1)+ln(sqrt(2*pi*2n)) < n*(100*ln(2)+1+ln(n))+ln(sqrt(2*pi*n))
    ln(2n+1) и ln(sqrt) можно выбросить как не особо существенные слагаемые, и поделить всё на n:
    2*ln(2n)< (100*ln(2)+1+ln(n))
    2*ln(n)+2*ln(2) < (100*ln(2)+1+ln(n))
    2*ln(n) < 98*ln(2)
    ln(n) < 49*ln(2)
    То есть для n больше чем 2^49(приблизительно), за 100n взвешиваний эту задачу нельзя решить даже теоретически.
     
  4. Stiver

    Stiver Партизан дзена

    Blog Posts:
    0
    Если я правильно понимаю вопрос, то речь идет о нахождении медианы, то есть в принципе стандартная задача. Существует алгоритм, позволяющий сделать это менее чем за 3х сравнений (где х - количество элементов), в данном случае соответственно за 6n+3. Описание можно посмотреть например здесь
    В университетском курсе скорее всего будут давать более старый алгоритм SPP, которого здесь тоже за глаза хватит :) там немного больше 3х сравнений.

    Поэтому вопрос: какой смысл имеет число 100 в вопросе? Такое ощущение, что это снова какое-то плохо сформулированное или второпях списанное упражнение из задачника.
     
  5. alpet

    alpet Александр

    Blog Posts:
    0
    Первое что вспомнилось - сначала quick sort, чтобы упорядочить веса по возрастанию, потом взять из получившегося ряду монету с индексом n+1 (т.е. среднюю). Должно подойти по условиям вроде.
     
  6. Stiver

    Stiver Партизан дзена

    Blog Posts:
    0
    alpet

    quicksort даст (в лучшем случае) n*log(n) > 100n
     
  7. Atlantic

    Atlantic Member

    Blog Posts:
    0
    Stiver
    quicksort необязательно выполнять полностью, так как нужно найти только медиану. Стандартный quicksort сначала разбивает массив на две части, все элементы в левой части меньше всех элементов в правой части. А теперь главный хинт: нам нужно найти элемент, находящийся на k-й (в общем случае) позиции в массиве. Зная размеры частей, можно определить, в какой из них (и на какой позиции) он будет после сортировки, и сортировать только эту часть. Таким образом можно избавиться от одного рекурсивного вызова, и время работы сократится до O(n).
    В ссылке, которую ты привел, должно быть описание этого алгоритма.
     
  8. MaXF

    MaXF New Member

    Blog Posts:
    0
    Спасибо БольШое