从巨大的对象列表(比如一百万个字符串)创建所有两对对象的最佳方法是什么?

时间:2010-08-30 14:28:21

标签: database algorithm

让我说我有一个10个字符串的列表(让我们称之为“str1”,“str2”,......“str10”等)。我希望能够从中生成所有对 (“str1”,“str2”) (“str1”,“str3”) 。 。 。 等等(“str9”,“str10”)。这很容易,有两个循环。如何用一百万个字符串做同样的事情?反正把它放在一个表中,然后运行查询吗?

4 个答案:

答案 0 :(得分:4)

将它们放在表格中,并使用此连接:

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

现在,如果您在某种查询分析器/ GUI中运行一个百万字符串,那么您可能会受到一些伤害 - 这会带来巨大的数据负载。

答案 1 :(得分:1)

在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]));

答案 2 :(得分:0)

如果你想创造所有这些对,你将获得近一万亿对 要将它们存储在某处,您需要大约20 TB的数据,基于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字符串需要一段时间。

答案 3 :(得分:0)

要在表中执行此操作(我假设您的意思是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