1

我的数据库中有一张桌子,上面有人员名单。我需要每天创建一个随机好友列表。

这个想法是,每天每个人都会与当天的不同随机人配对。

由于桌子可能会变得非常大,我想知道做这种事情的最佳方法是什么?

我想到了 2 个想法,但我对它们的性能不太确定。

1)我使用随机数生成器随机选择两个 id。问题在于我必须不断确保尚未调用数字,并且当我接近列表末尾时,这可能会变得非常慢。

2)从列表中他们下面的人开始每一个,然后每天简单地向下移动一个,直到你到达底部,此时我又回到顶部。

还有其他想法吗?

谢谢

4

3 回答 3

7

也许你可以做一个随机排序表的查询,然后从上到下对人进行配对。第一个条目与第二个配对,第三个与第四个配对,依此类推。

SQL Server 示例:

SELECT * FROM Table ORDER BY NEWID()
于 2009-05-26T07:55:13.383 回答
1

这并不难,使用随机生成器并不是很慢,但如果你很不幸,时间复杂度将变为 O(n^2),最好的情况下为 O(1),你喜欢这样吗?

但是,只要有一个连接两个人的表,看看他们的 ID 是否出现很快,如果没有,只需添加他们的 ID,使用 T-SQL 来释放额外的连接。

于 2009-05-26T07:56:47.453 回答
0

在我看来,这个问题已经解决了。

  1. 您想制作成对列表。
  2. 您想要所有配对列表(每天一个)

您不需要为此使用随机函数。您只需要生成所有对列表。

Wikipedia 上的Permutation页面包含您需要使用的算法的一些实现。

#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;

sub permutation {
    my ($k, $s) = @_;

    for my $j (1..(@$s-1)) {
        my $n = ($k % $j) + 1;
        ($s->[$n], $s->[$j]) = ($s->[$j], $s->[$n]);
        $k = int($k / $j);
    }
    return $s;
}

for (1..3) {
    my $s = permutation($_, [1,2,3,4]);
    my ($a, $b, $c, $d) = @$s;
    print "$a\t$b\n";
    print "$c\t$d\n";
    print "------\n";
}
于 2009-05-26T08:28:22.583 回答