Frage

Ich verbrachte eine beträchtliche Menge an Zeit-Codierung in Baeza-Yates' schnelle Schnittmenge Algorithmus für eine meiner apps. Während ich habe die STL set_intersect marginal out-do, die Tatsache, dass ich die resultierende Anordnung erforderlich jederzeit entfernt sortiert werden ich von der Umsetzung meiner eigenen Algorithmus gewonnen hatte, nachdem ich die Ausgabe sortiert. Da der STL set_intersect dies funktioniert gut, kann jeder Punkt mich auf den Algorithmus, dass es tatsächlich implementiert? Oder nicht implementiert es den gleichen Baeza-Yates-Algorithmus, aber nur in einer wesentlich effizienten Weise?

Baeza-Yates: http: // citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.7899&rep=rep1&type=pdf

War es hilfreich?

Lösung

Zumindest in den Implementierungen mir angeschaut habe, ist die Umsetzung ziemlich simpel - etwas auf dieser allgemeinen Ordnung:

template <class inIt, class outIt>
outIt set_intersection(inIt start1, inIt end1, inIt start2, inIt end2, outIt out) {
    while (start1 != end1 && start2 != end2) {
       if (*start1 < *start2)
           ++start1;
       else if (*start2 < *start1)
           ++start2;
       else {                 // equal elements.
           *out++ = *start1;
           ++start1;
           ++start2;
       }
    }
    return out;
}

Natürlich, ich bin die Eingabe nur das aus der Spitze von meinem Kopf - es wird wahrscheinlich nicht einmal kompilieren, und ist sicherlich nicht pedantisch richtig (zB soll wohl eine Vergleichsfunktion verwenden, anstatt operator< direkt zu verwenden, und sollte eine andere Template-Parameter haben, damit Start1 / end1 eine andere Art zu sein, von start2 / end2).

Aus algorithmischer Sicht aber ich würde vermuten, die meisten realen Implementierungen sind so ziemlich wie oben.

Andere Tipps

STL erfordert keinen speziellen Algorithmus, setzt sich nur Einschränkungen für die algorithmische Komplexität bestimmter Operationen. Da es alle Vorlage basiert, können Sie einfach die Quelle auf Ihre Implementierung sehen, um zu sehen, wie es funktioniert.

Interessant. So skaliert die Anzahl der Vergleiche in Ihrem Algorithmus linear mit der Anzahl der Elemente in beiden Sätzen. Der Baeza-Yates-Algorithmus geht so etwas wie dieses (beachten Sie, dass es sowohl die Eingabe übernimmt Sätze sortiert werden):

1) Finden Sie den Median der Menge A (A ist die kleinere Gruppe hier) 2) Suchen nach dem Median von A in B.     Wenn Sie gefunden werden, fügen Sie das Ergebnis     sonst wird der Einfügungsrang des Medians in B bekannt. 3) gesetzt Split A um seine mittlere in zwei Teile, und die Menge B über seinen Einfügungsrang in zwei Teile, und wiederholt die Prozedur rekursiv auf beiden Teilen. Dieser Schritt funktioniert, weil alle Elemente weniger als der Median in A nur mit diesen Elementen vor dem Einsetzen Rang von A Mitte in B. schneiden würden

Da Sie eine binäre Suche verwenden können, A der Median in B, eindeutig zu lokalisieren, die Anzahl der Vergleiche in dem dieser Algorithmus niedriger ist als die, die Sie erwähnt. In der Tat, in der „besten“ Fall die Anzahl der Vergleiche ist O (log (m) * log (n)), wobei m und n sind die Größen der Sätze, und im schlimmsten Fall die Anzahl der Vergleiche ist O (m + n). Wie auf der Erde habe ich mess up der Umsetzung dieses schlecht? : (

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top