· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Время комбинаторики

Посл.отвђт Сообщен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