1

DB に人のリストを含むテーブルがあります。毎日ランダムな仲間のリストを作成する必要があります。

アイデアは、毎日、すべての人がその日に別のランダムな人とペアになるということです.

テーブルが非常に大きくなる可能性があるため、そのようなことを行う最善の方法は何だろうかと考えていました。

2 つのアイデアを考えましたが、パフォーマンスに関してはよくわかりません。

1) 乱数ジェネレーターを使用して、2 つの ID をランダムに選択します。それに関する問題は、番号がまだ呼び出されていないことを常に確認する必要があり、リストの最後に近づくと、これが非常に遅くなる可能性があることです。

2) リストの下にいる人から始めて、毎日 1 つ下に移動し、一番下に到達したら、その時点で一番上に戻ります。

他のアイデアはありますか?

ありがとう

4

3 に答える 3

7

おそらく、テーブルをランダムに並べ替えるクエリを作成してから、人を上から下にペアリングすることができます。最初のエントリは2番目のエントリとペアになり、3番目は4番目のエントリとペアになります。

SQL Serverの例:

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

それほど難しいことではありません。ランダムジェネレーターの使用はそれほど遅くはありませんが、運が悪ければ時間計算量はO(n ^ 2)になり、最良の場合はO(1)になります。

ただし、2人を接続するテーブルを用意し、IDが高速であるかどうかを確認します。発生しない場合は、IDを追加し、T-SQLを使用して余分な接続を失います。

于 2009-05-26T07:56:47.453 に答える
0

この問題はすでに解決されているようです。

  1. ペアのリストを作成したい。
  2. ペアのすべてのリストが必要です(毎日1つ)

このためにランダム関数を使用する必要はありません。ペアのすべてのリストを生成する必要があります。

ウィキペディアの順列ページには、使用する必要のあるアルゴリズムの実装がいくつか含まれています。

#!/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 に答える