Задача простая - решение сложное
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Задача простая - решение сложное Expand / Collapse
Автор
Сообщение
18.09.2002 14:25
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 23.09.2002 12:47
Сообщ.: 2, Visits: 23
Предистория.
В процессе создания одной непростой проги, я встретился с проблемой ее быстродействия. После некоторых тестов, оказалось, что тормозит часть ядра основного алгоритма. Но оптимизировать ее оказалось не так уж и просто. Некие ошибки, исправить конечно удалось, но общая картина от этого не изменилась.
Я задался вопросом: можно ли вообще физически ускорить этот фрагмент алгоритма (или придумать другой более быстрый)?
Так как я новичок в решении таких задач, я хочу обратится к професионалам в этом деле (или просто за советом).

В чем суть задачи.
Сгенерировать все комбинации из k элементов на n позициях. (Пример: k=2, n=4 : 1100, 1010, 1001, 0101, 0110, 0011)

Какое должно быть решение.
Из всех существующих алгоритмов придумать самый быстрый.

Вопросы в тему.
Каким образом можно обосновать, что алгоритма быстрее данного, в решении некоторой задачи, нет?
Какие существуют методы (или проги) с помощью которых можно ускорить существующий алгоритм?
Сообщ. #761286
19.09.2002 12:05
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.02.2004 16:41
Сообщ.: 1 756, Visits: 19 372
проблема в том, что результатов очень много

c из n по к

n!/(k!*(n-k)!) максимальное количество когда k = n/2

поищи в yandex "генерация перестановок" приводятся некоторые алгоритмы
или в google "permutation generation"
Сообщ. #761356
23.09.2002 7:06
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 27.02.2003 8:42
Сообщ.: 11, Visits: 122
Перестановки бинарных разрядов на k - позициях - не что иное, как обычный десятичный счет от 0 до 2^к-1.
Начинаешь считать в цикле, а смотришь в двоичном виде.
А быстрее как?
Ведь это просто скорость вывода* на константу. Все равно выводить результаты надо.
Или тебе определенные комбинации нужны?
1)Посмотри книжку
М.О. Асанов "Дискретная оптимизация".
2)Растяни циклы.
3)Перейди на циклы с пост-условиями.
4)Всегда сравнивай с нулем.
5)Перепиши куски на ассемблере.
Сообщ. #761579
23.09.2002 9:01
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 28.10.2004 6:50
Сообщ.: 236, Visits: 2 597
Что ломаешь-то? Может проблема не в оптимизации данного алгоритма, а в принципе подхода, может и не стоит все комбинации перебирать.
Сообщ. #761584
23.09.2002 11:45
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.02.2004 16:41
Сообщ.: 1 756, Visits: 19 372
2 Disketka:
нет у него другая проблема, ему не все нужны, а только некоторые.
поэтому простым прибавлением бита к предыдущему результату не получится. Надо после каждого прибавления подсчитывать количество включенных битов, и если оно равно определенному числу тогда один из результатов найден.
Сообщ. #761599
23.09.2002 12:50
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 23.09.2002 12:47
Сообщ.: 2, Visits: 23
Спасибо за советы. Неплохая идея с битами, я попробую ее реализовать. В действительности мне нужны не все комбинации (мат. языком - сочитания), а те, которые удовлетворяют некоторое условие. По сути, эти комбинации являются шифром более сложного объекта, окончательный вид которого можно определить только полным перебором.
Для тех, кому интересно что делает эта прога, могу посвятить несколько строчек:
Сейчас существуют много программ, даже проектов, посвященных решению всем известных нонограмм - японских кроссвордов. Но до сих пор я не встретил, полного решения этой проблемы, тоесть проги которая может решить любую нонограмму, в широком смысле этого слова (решается или не решается, одно или много решений, как убить неоднозначность, решение поисковых задач, и т. п.) Поэтому я решил посвятить лишнее время созданию более углубленного алгоритма (алгоритмов), который(е) мог бы быстро все порешать (Может в будущем получится не плохая РешалкА). Но поскольку я не програмист, а математик, у меня возникают большие трудности в реализации своих идей.
Люди, если кто-то заинтерисовался, и имеет лишнее время, приглашаю к сотрудничеству! А может, знаете тех, кто тоже "болеет" этим - забейте стрелу!(Я не исключаю, возможности совмещения полезного с прятным: вместе немного заработать). Только так: Я НУЖДАЮСЬ НЕ В РЕКЛАМЕ, А В ПОДДЕРЖКЕ!
Сообщ. #761608
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 12:05