|
|
| Тема |
Re: подреждане на лопатки [re: Sargon lll] |
|
| Автор | ned (Нерегистриран) | |
| Публикувано | 28.09.08 13:12 |
|
|
|
Поздравления за инициятивата. За съжаление при програмирането няма такова нещо като "утвърдена методика". Една програма може да бъде написана по много различни начини - по-добри или по-лоши. Методиката идва от уменията на програмиста и задълбоченото му познаване на алгоритмичната теория и математиката. Всъщност методиката, която търсиш е някой да е написал вече подобна програма. Иначе добра книжка е например “Алгоритми + Структури от данни = Програми” - Н. Уирт -това е от автора на езика "Паскал".
Понеже, явно си решил да си напишеш сам програмата ще продължа още малко разсъжденията си от снощи. И все пак нека видим колко са аджеба възможните положения на лопатките? Казахме, че:
1 пермутаците на n елемента са n!, но
2 можем да използваме ротация и симетрия и то циклично
Да видим колко ни помага това (обяснявам просто и подробно):
При даден вариант ротацията можем да приложим циклично n пъти докато се върнем в първоначалното положение, а симетрията само веднъж, защото при повторна симетрия се връщаме в първоначалното положение. Всички еквивалентни варианти (вкл. изходния) можем да изчерпим чрез n ротации, обръщане и още n ротации - т.е. това прави 2n. Ако разпишем всички пермутации и започнем да маркираме еквивалентните такива, то след X маркирания остатъка ще е T = n! - x*2*n. Процесът може да продължи докато не остане нищо за маркиране, т.е. T = 0. Оттам n! - x*2*n = 0, следователно
броя РАЗЛИЧНИ варианти е x = n!/(2n) или x = (n-1)!/2 вместо n!.
Да видим как се отразява това при брой:
n n! (n-1)!/2
1 1 1
2 2 1
3 6 1
4 24 3
5 120 12
6 720 60
7 5040 360
8 40320 2520
9 362880 20160
10 3628800 181440
Интересно, е че до три лопатки няма значение как са разположени, което и в действителност е така. Въпреки направеното подобрение броя варианти пак нараства бързо, но все пак вече може да смятаме с до десетина лопатки без да чакаме много.
Въпроси и отговори:
Може ли да не разписваме всички варианти и да ги елиминираме, а да генерираме направо уникалните - ДА можем! Как - не казвам.
Може ли да подобрим допълнително нещата - ДА можем:
Например ако две лопатки са с еднакви или много близки тегла има ли смисъл да ги разменяме - НЕ.
Има ли смисъл да подредим най-тежките лопатки от едната страна, а най-леките от другата - НЕ.
Може ли да организираме алгоритъма, така че да елиминираме неблагонадеждните кандидати, но без да пропуснем решението - ДА.
Има ли и други хитрости - ДА.
Както ти казах в първия постинг ми е по-лесно направо да поразпиша програмката вместо в няколко десетки постинга да обяснявам как става това - сложно е и губи време, а имам и работа.
Толкоз от мен, успехи!
| |
| |
|
|
|