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

Тема в разделе "WASM.HEAP", создана пользователем MaXF, 15 янв 2007.

  1. MaXF

    MaXF New Member

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

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    [сообщение мимо кассы]
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Пронумеруем все монеты.
    Очевидно что искомая монета может иметь любой номер.
    А среди оставшихся 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 Партизан дзена

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

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

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Первое что вспомнилось - сначала quick sort, чтобы упорядочить веса по возрастанию, потом взять из получившегося ряду монету с индексом n+1 (т.е. среднюю). Должно подойти по условиям вроде.
     
  6. Stiver

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

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    alpet

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

    Atlantic Member

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

    MaXF New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    5
    Спасибо БольШое