Каков наилучший способ создать все пары объектов из двух, из огромного списка объектов (скажем, миллион строк)? - PullRequest
0 голосов
/ 30 августа 2010

допустим, у меня есть список из 10 строк (давайте просто назовем его "str1", "str2", ... "str10" и т. Д.).Я хочу иметь возможность генерировать все пары из этого ("str1", "str2") ("str1", "str3").,,и т.д. до ("str9", "str10").Это легко, с двумя петлями.Как сделать то же самое с миллионом строк?Есть ли способ поместить его в таблицу и выполнить запрос?

Ответы [ 4 ]

4 голосов
/ 30 августа 2010

Положите их в таблицу и используйте это объединение:

Select t1.StringValue, T2.StringValue
From StringsTable T1
    INNER JOIN StringsTable T2
        ON T1.StringValue <> T2.StringValue

Теперь, если вы запускаете миллион строк в каком-либо Query Analyzer / GUI, вы настраиваете себя на какое-то повреждение - это огромное количество возвращаемых данных.

1 голос
/ 30 августа 2010

В C # (Java будет похожим. C ++ только немного отличается)

 for(int i = 0; i < ArrayOfString.Length-1; ++i)
     for(int j = i+1; i < ArrayOfString.Length; ++j)
         ListOfPairs.Add(new Pair(ArrayOfString[i], ArrayOfString[j]));
0 голосов
/ 18 января 2013

Для этого в таблице (я полагаю, вы имеете в виду SQL Server или аналогичный)

create table T
(
    Value nvarchar(10)
)

insert into T select '1'
insert into T select '2'
insert into T select '3'
insert into T select '4'
insert into T select '5'

select
    A.Value, B.Value
    from T A
    Cross Join T B
    where A.Value<>B.Value
    order by A.Value
0 голосов
/ 30 августа 2010

Если вы хотите создать все эти пары, вы получите почти один триллион пар.
Чтобы хранить их где-то, вам потребуется приблизительно 20 ТБ данных на основе 20 байтов на пару строк.

Если вы хотите собрать все эти пары, вам следует подумать о генеративном подходе, который генерирует пары на лету, а не хранит их где-то.

В c # это будет выглядеть примерно так:

private IEnumerable<Tuple<string, string>> GetPairs(IEnumerable<string> strings)
{
    foreach (string outer in strings)
    {
        foreach (string inner in strings)
        {
            if (outer != inner)
            {
                yield return Tuple.Create(outer, inner);
            }
        }
    }

    yield break;
}

Звонок

string[] strings = new string[] { "str1", "str2", "str3" };

foreach (var stringPairs in GetPairs(strings))
{
    Console.WriteLine("({0},{1})", stringPairs.Item1, stringPairs.Item2);
}

Генерирует ожидаемый результат (если вы заботитесь о порядке элементов в паре).

(str1,str2)
(str1,str3)
(str2,str1)
(str2,str3)
(str3,str1)
(str3,str2)

Ожидайте, что это займет некоторое время со строками 1M.

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