문제

DB에 사람들의 목록이있는 테이블이 있습니다. 매일 임의의 친구 목록을 만들어야합니다.

아이디어는 매일 모든 사람이 그날 다른 임의의 사람과 짝을 이루는 것입니다.

테이블이 매우 커질 수 있으므로 그런 일을하는 가장 좋은 방법이 무엇인지 궁금했습니다.

나는 두 가지 아이디어를 생각했지만 성능과 관련하여 그들에 대해 확신하지 못합니다.

1) 난수 생성기를 사용하여 무작위로 두 개의 ID를 선택합니다. 그 문제는 끊임없이 숫자를 호출하지 않았는지 확인해야하며 목록의 끝에 가까워지면 실제로 느리게 될 수 있다는 것입니다.

2) 목록에서 아래의 남자와 함께 모든 사람을 시작하고 내가 맨 위로 돌아갈 때까지 매일 하루를 내려갑니다.

다른 아이디어가 있습니까?

감사

도움이 되었습니까?

해결책

아마도 테이블을 무작위로 정렬 한 쿼리를 만들고 사람들을 상단에서 짝을 이룰 수 있습니다. 첫 번째 항목은 두 번째 항목, 세 번째는 네 번째 등과 짝을 이룹니다.

SQL Server 예 :

SELECT * FROM Table ORDER BY NEWID()

다른 팁

무작위 제너레이터를 사용하는 것은 실제로 속도가 느리지 않지만 매우 운이 좋지 않으면 시간 복잡성이 O (n^2)가되고 최선의 경우 O (1)이되는 것은 어떻습니까?

그러나 두 사람을 연결하는 테이블 만 있으면 ID가 빠르지 않은지 확인하지 않으면 신분증을 추가하고 T-SQL을 사용하여 추가 연결을 느슨하게하십시오.

이 문제는 이미 해결 된 것 같습니다.

  1. 쌍 목록을 만들고 싶습니다.
  2. 당신은 모든 쌍 목록을 원합니다 (매일 하나)

이를 위해 임의의 기능을 사용할 필요가 없습니다. 모든 쌍 목록을 생성하면됩니다.

그만큼 순열 Wikipedia의 페이지에는 사용해야 할 알고리즘의 몇 가지 구현이 포함되어 있습니다.

#!/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";
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top