Frage

Ich habe eine Tabelle in meiner DB mit einer Liste von Personen. Ich brauche jeden Tag eine Liste von Zufall Freunden erstellen.

Die Idee ist, dass jeder Mensch jeden Tag für diesen Tag mit einer anderen zufälligen Person gekoppelt ist.

Da die Tabelle sehr groß bekommt ich frage mich, was der beste Weg, um so etwas zu tun wäre?

Ich habe gedacht 2 Ideen, aber ich bin nicht so sicher, sie in Bezug auf Leistung.

1) Ich verwende einen Zufallszahlengenerator zufall zwei IDs auszuwählen. Das Problem dabei ist, dass ich die Zahlen stellen Sie sicher, ständig haben wurden noch nicht genannt und als ich an das Ende der Liste nahe kommen kann dies wirklich langsam bekommen.

2) jeder weg mit dem Mann unter ihnen in der Liste starten und einfach man jeden Tag nach unten zu verschieben, bis Sie auf den Boden zu Whcih Punkt komme ich nach oben bewegen zurück.

Jede andere Ideen?

Danke

War es hilfreich?

Lösung

Vielleicht können Sie eine Abfrage machen, die die Tabelle zufällig sortiert, und dann werden die Menschen nur paaren von oben nach unten. Der erste Eintrag wird mit dem zweiten gepaart dritten mit den vierten und so weiter.

SQL Server Beispiel:

SELECT * FROM Table ORDER BY NEWID()

Andere Tipps

Es ist nicht wirklich so schwer, mit einem Random-Generator nicht wirklich langsam, aber wenn Sie sehr unglücklich sind die Zeitkomplexität wird O werden (n ^ 2) und in bestem Fall O (1), wie gefallen Sie das ?

Allerdings haben nur eine Tabelle, die zwei Personen verbindet, sehen, ob ihre IDs occure, die schnell ist, wenn es nicht, nur ihre IDs hinzuzufügen, verwenden Sie T-SQL zusätzliche Verbindungen zu lösen.

Es scheint mir, dieses Problem bereits gelöst.

  1. Sie wollen Listen von Paaren machen.
  2. Sie möchten, dass alle Listen von Paaren (eine für jeden Tag)

Sie brauchen nicht eine Zufallsfunktion für diesen Einsatz. Sie müssen nur alle Listen von Paaren erzeugen.

Die Permutation Seite auf Wikipedia enthält einige Implementierungen des Algorithmus, die Sie verwenden müssen .

#!/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";
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top