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