|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 25, 2003 22:47:47 Народ, я уже подзабыл это дело... Словом, ткните меня носом. Положим, у меня есть массив, в котором мне нужно перебрать все элементы. Черт, даже сформулировать нормально не могу :( Короче, то ли перестановку, то ли сочетание, то ли размещение. Я уже все эти термины и забыл :((( Если есть линки - буду очень рад. algolist предлагать не надо - там паскаль и объяснения маленько заумны. Мне бы что-то на С/С++. На худой конец, Perl/Java. Асм тоже сойдет, на С потом переведу. Да, и еще. Вот есть у меня в массиве, скажем, a, b, c, d. Мне надо попарно перебрать все возможные варианты, при этом порядок не важен, т.е., так: a - b a - c a - d b - c b - d c - d вроде, все. Как это называется ;( и как это сделать наиболее эффективно? |
|
|
Дата: Окт 25, 2003 22:48:51 Кажется, это называется "размещение"... Позор на мою лысину :( |
|
|
Дата: Окт 26, 2003 00:01:32 Биноминальные коэффициенты тут помогут, только: Из твоего примера непонятно толи это размещения то ли сочетания: т.е. тебе нужно только b и d или важно их местоположение т.е. из b и d составляются две пары {b,d;d,b}? |
|
|
Дата: Окт 26, 2003 01:54:03 The Svin Мне нужно ТОЛЬКО b и d. Биноминальные коэффициенты? Чтоб вас, Свин, за такие объяснения... ;) Поточнее мона? |
|
|
Дата: Окт 26, 2003 02:17:50 · Поправил: volodya The Svin Нашел чуток по коэффициентам на nr.com - глава 6. Но там крошечно... Кроме того, это мне даст лишь общее число, а мне надо сгенерировать пары. Просто взять массив и выдрать оттуда необходимое число комбинаций, и, скажем, распечатать их на экран. |
|
|
Дата: Окт 26, 2003 02:29:41 Perl: @arr=($a,$b,$c,$d); for ($i=1;$i<$d;$i++) { for ($j=$i+1;$j<=$d;$j++) { # теперь в $a(i) - 1-е значение, $a(j) - 2-е } } |
|
|
Дата: Окт 26, 2003 02:31:48 Тогда, Володя, это - сочетания. Те выбор по K из N без учёта порядка расположения. Для пар (K=2) это очень просто. Пусть n - это колличество элементов а x = n-1 Тогда колличество таких пар будет равно сумме участка арифметической прогресси с шаго +1 от 1 до X т.е. (x(x+1))/2=(x^2+x)/2 Например если их 4 то колличество пар = (3^2+3)/2=6 если 5 то (4^2+4)/2=10 и т.д. если представить элементы как ряд то алгоритм сводится к простому действию. взять крайний слева элемент и последовательно соединить его с каждым справа. потом взять следующий и соединить его с каждым справа уже от него и так до тех пор пока очередной "1ый" элемент не окажется последним - его уже соединять не с чем и алгоритм заканчивается. На асме можно сделать довольно быстро но если тебе асм нужен только для того, чтобы перевести в C то даже пытаться не буду, распараллеленый будет трудно переводить а после перевода компилятор сделает хуже, т.что нафиг это нужно. Формальный псевдо алгоритм может быть приблизительно такой. пара[m]=array[j]+array[i] означает в его синтаксисе что у элемента типа пара (который состоит из 2х элементов array) включаются два элемента в правой части выражения а не арифметическое сложение: n-колличество элементов расположенные в array от array[0] до array[n-1]
m=0
j=0
Пока j<n-1
i=j+1
Пока i<n
пара[m]=array[j]+array[i]
m=m+1
i=i+1
конец пока
j=j+1
конец пока
Вроде так. |
|
|
Дата: Окт 26, 2003 02:51:32 я думаю вряд ли получится использовать для этого один цикл. в принципе у The Svin'а такой же пример,только циклы "пока". Но он, в отличие от меня, объяснил все, причем очень хорошо |
|
|
Дата: Окт 26, 2003 02:54:24 The Svin Все понял, все усвоил. Вы, меж прочим, шикарно объясняете! В понедельник напишу код. Еще раз спасибо за такие объяснения, какими они должны быть. Просто супер. Я чувствую себя круче ;) |
|
|
Дата: Янв 22, 2004 03:14:29 В общем случае сочетания считаются так (k<=n): С из n по к = n!/((n-k)!*k!) или = (n-k+1)(n-k+2)..(n)/k!. Например :В классе 30 учеников .У каждого по 2 фотографии. Найти количество всевозможных различных пар фото ,если известно что ученики могут меняться фото. 1- a,b {(a,c),(a,d)..(a,Ae) и (c,b),(d,b)..(Ae,b) 2- c,d (a,d) и (c,b) откидываем и т.д. .. .. 30-Ad,Ae .. В результате С из 60 по 2 =60!/((60-2)!(2)!) или =59*60/(2)! = 59*30 = 1770 .Вроде так . |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073 |