我的数据库中有一张表,其中包含一个人员列表。我需要每天创建一个随机好友列表。
这个想法是每天每个人都与当天不同的随机人物配对。
由于桌子可能会变得很大,我想知道做这种事情的最佳方法是什么?
我想到了2个想法,但我对他们的表现并不是很确定。
1)我使用随机数生成器随机选择两个ID。问题是我必须经常确保数字还没有被调用,当我接近列表的末尾时,这可能变得非常慢。
2)在列表中与他们下面的人一起开始每一个人,然后每天向下移动一个,直到你回到底部我回到顶部。
还有其他想法吗?
谢谢
答案 0 :(得分:7)
也许您可以创建一个随机对表进行排序的查询,然后从上到下配对人。第一个条目与第二个条目配对,第三个条目与第四个条目配对,依此类推。
SQL Server示例:
SELECT * FROM Table ORDER BY NEWID()
答案 1 :(得分:1)
实际上并不是那么难,使用随机生成器并不是很慢但是如果你非常不走运,时间复杂度会变成O(n ^ 2),最好是O(1),你觉得怎么样? ?
但是,只需要一个连接两个人的表,看看他们的ID是否快速发生,如果没有,只需添加他们的ID,使用T-SQL来释放额外的连接。
答案 2 :(得分:0)
在我看来,这个问题已经解决了。
您不需要使用随机函数。您只需要生成所有对的列表。
维基百科上的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";
}