Хорошая программистская задачка:
Дан список с данными. И есть подозрение, что более половины элементов в списке - это один и тот же элемент (число, например). Требуется определить, так ли это, и если так — то что это за элемент и сколько раз он встречается. За линейное время и без дополнительной памяти. (кроме константы).
Ссылку на журнал, из которого взял, дам позже, т.к. в нём есть решение.
P.S. Есть разные способы решения (я нашёл один из них, но не лучший, как потом узнал). Если из алгоритма неочевидно, что он всегда работает, нужно это доказать, иначе решение неполное.
Дан список с данными. И есть подозрение, что более половины элементов в списке - это один и тот же элемент (число, например). Требуется определить, так ли это, и если так — то что это за элемент и сколько раз он встречается. За линейное время и без дополнительной памяти. (кроме константы).
Ссылку на журнал, из которого взял, дам позже, т.к. в нём есть решение.
P.S. Есть разные способы решения (я нашёл один из них, но не лучший, как потом узнал). Если из алгоритма неочевидно, что он всегда работает, нужно это доказать, иначе решение неполное.
no subject
Date: 2004-07-12 04:14 pm (UTC)no subject
Date: 2004-07-13 11:16 am (UTC)http://kvant.mccme.ru/1979/09/zadachnik_kvanta_matematika.htm
no subject
Date: 2004-07-13 11:21 am (UTC)no subject
Date: 2004-07-13 11:35 am (UTC)Если твоих объектов четное число, разбиваешь их на пары, и называешь пару "хорошей" если входящие в нее объекты равны. Нехорошие пары выкидываются, а из каждой хорошей берется по представителю. Легко видеть, что в полученном м-ве представителей будет большинство однотипных объектов, если их было большинство в исходном м-ве. И.т.д.
Ситуация ухудшается, если исходных объектов - нечетное число. Тогда, при разбиении на пары, один придется выкинуть, и в новом м-ве однотипных может оказаться ровно половина. Но и в этом случае все вытанцовывается, хотя строгое решение слегка нудновато. (Я его писал много лет назад.)
Так же с химиками: разбиваешь на пары, спрашиваешь каждого о напарнике. Называешь пару "химической" если оба ответили, что напарник химик. Нехимические пары игнорируешь, из каждой химической берешь по представителю, и т.д. Так получется 2N-2 ответа. В твоей задаче - даже меньше, потому что для установления "хорошей" пары требуется одно сравнение, а для "химической" - два вопроса.
Но решение Дьяка (с модификацией Обломова) мне нравится больше. Хотя их алгоритм длиннее, его несколько проще запрограммировать.
no subject
Date: 2004-07-13 02:50 pm (UTC)