Отговори на тема  [ 12 мнения ] 
Алгоритъм за сравняване на числа? 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Алгоритъм за сравняване на числа?
Искам да генерирам примерно 6 цифрени числа, в които всяка цифра се среща един път и не надвишава разредността на числото, в случая 6.
Примерно 123456, 123465,654321 и т.н.
Зле съм в комбинаториката и за по лесно решавам да ползвам няколко вградени for цикъла, които въртят всеки разряд на числото.
Така ще трябва да отсявам нужните ми комбинации, което обаче опира до голям брой сравнения между всеки разряд с останалите.
Предполагам че има по-елегантен начин да се получи това което искам, някакви идеи?


Нед Авг 19, 2012 12:01 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Юли 07, 2012 2:36 pm
Мнения: 5
Мнение Re: Алгоритъм за сравняване на числа?
Заделяш 10 бита и ги нулираш.
Правиш цикъл от едно от разредите на числото.
Генерираш случайно числи 0..9
Проверяваш дали съответния бит е вдигнат, значи числото е било теглено вече. Повтаряш реда.
Добавяш към реда с генерирани числа и вдигаш съотвения бит.

:wink:


Нед Авг 19, 2012 12:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: Алгоритъм за сравняване на числа?
И накрая като остане само една възможност седиш и чакаш докато рандъм генератора ти я улучи... :D

_________________
Най-опасният враг на истината и свободата е мнозинството.


Нед Авг 19, 2012 12:27 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Юли 07, 2012 2:36 pm
Мнения: 5
Мнение Re: Алгоритъм за сравняване на числа?
Zdrav написа:
И накрая като остане само една възможност седиш и чакаш докато рандъм генератора ти я улучи... :D


Вероятност 1:10. Едва ли ще чакаш повече от 10мс :D


Нед Авг 19, 2012 12:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Алгоритъм за сравняване на числа?
Ммммммм не мисля че е точно 1:10, ако рандъм генератора е наистина случаен, зависи от типа му, но може и да е 1:50 ... ако не е съвсем случаен току виж е 1:100, ти виждал ли си рандом генератор който от 10 запитвания връща 10 различни стойности .. то тогава ниакак няма да е рандъм, почвам да мечтая за покер или слот машина с такъв, 1 от 10 тегления ти е гарантирана печалба ...:)
По скоро малко математика трябва, ама нещо не ми хрумва как точно да стане, може да се понапъна, ама със сигурност има други които ще ме преварят, напоследък комбинаториката ми се изчрва с това как прекарам 10 тръби Ф400 със по 5 колена, така че хем да не си пречат хем да са достъпни, хем и да могат да се подменят ... ако някой си мисли че рутирането на платка е зор ... верно поне че можеш да режеш и сменяш колкото искаш, само дето всичко струва $$$, та още го разигравам в солида, да е жив и здрав който го е измислил тоя софт.


Нед Авг 19, 2012 6:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: Алгоритъм за сравняване на числа?
Всъщност последната цифра програмката трябва да я попълни сама без да чака.

Сещам се за подобна задачка която правих преди време. Но там вместо рандом генератор всяко поредно число се въвежда от оператор. Софтуера на всяка последователна стъпка стеснява избора на оператора, като изключва от множеството на възможните числа вече въведените.
Та моето предложение е за праволинеен подход.
На всяка следваща стъпка стеснявай множеството на рандъм генератора. На първата стъпка връща от 0 до 9. На втората връща от 0 до 8 и т.н. на предпоследната от 0 до 1. Последната стъпка цифрата се попълва без да се ползва рандъм генератора.
Съответно трябва да поддържаш нещо като map, чрез който да конвертираш полученото от рандъм генератора на всяка стъпка в конкретна цифра от множеството на възможните. Което множество на всяка стъпка се стеснява.
Например в началото този map изглежда така:
0 - 0
1 - 1
2 - 2
3 - 3
4 - 4
5 - 5
6 - 6
7 - 7
8 - 8
9 - 9

Да речем че на първата стъпка е изтеглено числото 4.
Съответно множеството от възможните за втора стъпка става {0,1,2,3,5,6,7,8,9}. Рандъм генератора трябва да ти върне за втората стъпка число в интервала 0 до 8. И съответно map-а за втората стъпка изглежда така:

0 - 0
1 - 1
2 - 2
3 - 3
4 - 5
5 - 6
6 - 7
7 - 8
8 - 9

Ако на втората стъпка бъде изтеглено числото 6. Според map-а това съответства на числото 7.

И така докато размера на map-а стане равен на единица и съдържа последното число, което взимаме направо.

ПС: Ако съм разбрал правилно задачата де :D

_________________
Най-опасният враг на истината и свободата е мнозинството.


Нед Авг 19, 2012 7:22 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Яну 04, 2007 12:43 am
Мнения: 178
Мнение Re: Алгоритъм за сравняване на числа?
Класическият начин да се направи това е с разместване.
В условието на задачата не е дефинирано дали трябва да се изгенерират всички пермутации от 6 елемента или случайна пермутация, но всяка една от тях може да се получи от изходното число с (n-1) размествания.
Например:
- тръгва се от начална стойност 123456 (може и като стринг "123456");
- генерира се число (по случаен закон или с цикъл) от 0 до 5 и първата цифра се разменя с цифрата от тази позиция (естествено, при 0 не се прави размяна);
- на следващата стъпка се генерира число от 1 до 5 и втората цифра се разменя с посочената позиция и т.н.
Ако трябва да се генерират всички пермутации, на практика това става с пет вложени цикъла.


Нед Авг 19, 2012 9:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Алгоритъм за сравняване на числа?
Най добре е да си ги изгенерира. Не са толкова много числата за съвременен компютър и със сигурност няма да му се повтарят.

_________________
Warriors of the Night, ASSEMBLER!!!


Нед Авг 19, 2012 9:53 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: Алгоритъм за сравняване на числа?
Трябват ми всички пермутации.
Без значение дали са в някакъв подреден или случаен ред и начална стойност.
Наистина комбинациите са малко и могат да се изгенерират всякак.
Исках да разбера дали има по универсален подход, защото разредността може да е различна от посочената, като примерна.

БатеВаньо, идеята с преместването е интересна, ще се опитам да вникна в нея :)


Нед Авг 19, 2012 10:21 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Яну 04, 2007 12:43 am
Мнения: 178
Мнение Re: Алгоритъм за сравняване на числа?
Ако се генерират всички пермутации, тогава алгоритъмът може да се генерализира, така че броят на цифрите да не е твърдо кодиран в структурата на програмата.
Ясно е, че броят на всички пермутации от n елемента е n!. Тогава може да се завърти цикъл от 0 до (n! - 1) и за всяка стойност на променливата да се изгенерира съответната пермутация.
А генерирането може да стане като за всяка стойност на този (да го наречем) индекс първо се намери частното и остатъкът от делението му на 2. Остатъкът (+ n - 2) се използва като индекс за разместване на n-2-рата цифра.
Частното от предишната операция се използва като се дели на 3 и пак се намира частно и остатък (напр. чрез стандартната функция div() ). Остатъкът отново се използва за разместване, а частното се използва по-нататък...
Така разместването се прави в обратен ред, но пак се получават всички пермутации.


Нед Авг 19, 2012 10:43 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение Re: Алгоритъм за сравняване на числа?
Има алгоритъм (мисля, че с почти линейна сложност), който осигурява съответствие между пермутациите от даден ред и естествените числа. Т.е. ти му подаваш 1, 2, 3… а той ти връща 123456, 123465,…
Ако го изнамериш, достатъчно е само да извъртиш един цикъл по броя пермутации и да ги подадеш на функцията за съответствие.


Пон Авг 20, 2012 12:01 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение Re: Алгоритъм за сравняване на числа?
Един програмист отишъл при свой колега и го попитай:
-Извинявай, имаш ли генератор на случайни числа?
Колегата му отговорил:
-12.

_________________
Хайде де!


Пон Авг 20, 2012 2:04 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни