Как я могу эффективно перебирать пары в массиве без дублирования? - PullRequest
0 голосов
/ 15 июля 2011

Предположим, у меня есть 3 команды, каждая из которых должна сыграть друг друга один раз.Как эффективно выполнить итерацию по ним, чтобы запланировать матчи без дубликатов?

    $teams = range('a', 'c');
    $games = array();
    foreach ($teams as $t1)
        foreach ($teams as $t2)
            if ($t1 != $t2)
                $games[] = $t1 . ' vs. ' . $t2;
    print_r($games);

Результат:

    Array
    (
        [0] => a vs. b
        [1] => a vs. c
        [2] => b vs. a  <-- Duplicate of [0]
        [3] => b vs. c
        [4] => c vs. a  <-- Duplicate of [1]
        [5] => c vs. b  <-- Duplicate of [3]
    )

Как эффективно избежать повторяющихся совпадений?

Ответ должен дать:

    Array
    (
        [0] => a vs. b
        [1] => a vs. c
        [2] => b vs. c
    )

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

В общем:

Container C;
for (i = 0; i < C.size; ++i)
{
  for (j = i + 1; j < C.size; ++j)
  {
    /* have unique unordered set {i, j} */
  }
}

Если вы хотите диагональные записи (i, i), начните с j = i.

1 голос
/ 15 июля 2011

Это решение не такое элегантное, как у @ Kerrek, но оно выполняет ту же работу:

$teams = range('a', 'c');
$games = Array();
$matched = Array();

foreach ( $teams as $t1 )
    foreach ( $teams as $t2 )
        if ( $t1 != $t2 )
            if ( !in_array( Array( $t1, $t2 ), $matched ) && !in_array( Array( $t2, $t1 ), $matched ) )
            {

                $games[] = $t1 . ' vs. ' . $t2;
                $matched[] = Array( $t1, $t2 );

            }

print_r( $games );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...