题
我有一个表在我的数据库与人的名单。我需要创建每天随机好友列表。
的想法是,每天每个人都与不同的随机人的那一天配对。
由于该表可能会非常大,我想知道什么是做这种事的最好办法?
我已经想到了2个想法,但我不这么肯定他们在性能方面。
1)I使用一个随机数发生器随机地选择两个标识。但问题是,我必须不断地确保数字是没有打电话,因为我去接近列表的末尾这样可以得到真正的慢。
2)与列表中它们下面的家伙开始每一个关闭,只需每天向下移动一个,直到你在whcih点底部我搬回到顶部。
任何其他的想法?
由于
解决方案
也许你可以作出这样的随机排序表的查询,然后只配对的人从上往下。的第一个条目被配对与所述第二,第三与第四等。
SQL Server的示例:
SELECT * FROM Table ORDER BY NEWID()
其他提示
这不是真的那么难,使用随机生成器是不是很慢,但如果你是非常不吉利的时间复杂度将成为为O(n ^ 2),在最好的情况下O(1),你怎么这样?
然而,仅仅有一个连接两个人一表,看看它们的ID occure这是快,如果它不,只需添加相应的ID,使用T-SQL松动额外的连接。
在我看来,这个问题已经解决了。
- 您想使对名单。
- 您想对所有的列表(一个用于每一天) 醇>
您不需要使用随机函数这一点。你只需要生成对所有列表。
在置换的维基百科页面包含您需要使用算法的几种实现
#!/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";
}
不隶属于 StackOverflow