Beginnen wir mit einer interaktiven Lösung. Die Tabellenoperationen Zusammenfassung Und Verbinden kann zur Bestimmung von Vereinigungen, Schnittmengen und Differenzen verwendet werden. Gewerkschaften sind am einfachsten. Tragen Sie einfach alles in eine Spalte ein und Gruppe durch diese Spalte. Die Union wird nach Entfernung der Duplikate als erste Spalte in der resultierenden Tabelle angezeigt. Um einen Schnittpunkt zu finden, erstellen Sie zunächst eine einspaltige Tabelle für jeden Eingabesatz und fügen Sie dann jeweils zwei Tabellen zusammen, um sicherzustellen, dass dies der Fall ist Nichtübereinstimmungen einbeziehen Und Multiples löschen für beide Sets. Sie müssen nur eine der resultierenden Spalten beibehalten, da diese identisch sind. Der Schnittpunkt sind die Zeilen, die nach der Verknüpfung aller Tabellen übrig bleiben. Um Unterschiede zu ermitteln, erstellen Sie zunächst die Vereinigung aller Mengen. Dies wird als Hauptspalte dienen. Verbinden Sie dann jeden Satz wieder mit der Hauptspalte und achten Sie darauf, Nichtübereinstimmungen einzubeziehen (aber dennoch Vielfache zu löschen). Fehlendes Datenmuster kann verwendet werden, um die für jeden Satz eindeutigen Werte zu identifizieren. Es werden die Zeilen in der Tabelle „Missing Data Pattern“ sein, die nur eine 0 haben.
Die Skripterstellung dieser Lösung ermöglicht einige Optionen. Eine einfache und schnelle Möglichkeit, die Vereinigung zu erhalten, besteht darin, alle Werte in eine Liste zu laden und sie dann zu verwenden Zusammenfassung um die einzigartigen Werte zu finden. Zuvor haben wir gesehen, dass die Verkettung von Vektoren langsam sein kann, daher ist es am besten, dies sowohl für Zahlen als auch für Zeichen zu verwenden.
Überraschenderweise gibt es eine schnellere Möglichkeit, numerische Werte in eine Tabelle zu übertragen, indem man die Liste überspringt und sie direkt in eine Tabelle lädt. Darauf wurde ich aufmerksam gemacht @brady_brady während unserer Diskussion dieses Problems. Zählen Sie zunächst die Anzahl der Elemente, fügen Sie so viele Zeilen zur Tabelle hinzu und durchlaufen Sie dann die Eingabe noch einmal, um die Werte zur Tabelle hinzuzufügen. Eine kurze Überprüfung der beiden Methoden zum Laden von Daten zeigt, dass letztere zwei- bis dreimal schneller sein kann. Ein Beispiel für die Anwendung beider Methoden auf die Vereinigung von zwei oder mehr Mengen ist in angegeben Union mithilfe von Tabellenoperationen.JSL . Bei der Arbeit mit Zeichendaten bietet es nur eine geringfügige Verbesserung.
Sobald die Daten in eine Tabelle geladen und zusammengefasst sind, werden die Schnitt- und Differenzoperationen abgeleitet, indem jeder Satz wieder mit den Zusammenfassungsdaten verknüpft wird. Wie oben erwähnt, für Kreuzungen, wenn wir Verbinden Wenn Sie Vielfache löschen und nur Übereinstimmungen beibehalten, enthält die letzte verknüpfte Tabelle die Schnittmenge. Der Verknüpfungsprozess wird vorzeitig gestoppt, wenn zu irgendeinem Zeitpunkt eine Tabelle ohne Zeilen entsteht, was darauf hinweist, dass die Schnittmenge leer ist. Für die Differenz werden Nichtübereinstimmungen beibehalten (Mehrfachpaare werden jedoch weggelassen). Die Unterschiede werden mithilfe des Missing Data Pattern ermittelt. Beispiele dafür, wie diese Operationen codiert werden können, finden Sie in Legen Sie Funktionen mit Table Operations.JSL fest
Wie ist das im Vergleich zu einer rein skriptbasierten Lösung? Eine schnelle und saubere Möglichkeit, Vereinigungen, Schnittmengen und Differenzen zu skripten, ist die Verwendung von Assoziative Arrays und die dazugehörigen Betriebsmeldungen (z. B. Schneiden Und Holen Sie sich Schlüssel ). Ein Beispiel hierfür wurde von gegeben @jthi im vorherigen Beitrag. Ich habe eine weitere Reihe von Beispielen bereitgestellt Legen Sie Operationen mit Associative Arrays.JSL fest . Die beiden Funktionssätze sehen sehr ähnlich aus, der Hauptunterschied besteht darin, dass ich sie vermieden habe Rekursion . So sehr ich Rekursion liebe, mache ich mir (zu Recht oder zu Unrecht) Sorgen, dass sie langsamer wird, wenn sie zu tief geht.
Ich habe eine Reihe von Simulationen unter verschiedenen Bedingungen durchgeführt, wie in der Tabelle unten gezeigt, um die Geschwindigkeiten von Associate Arrays vs. Tabellenoperationen zu vergleichen. Jede Simulation wurde zehnmal mit einem neuen Satz zufällig generierter Werte durchgeführt. Jeder Satz hatte die gleiche Größe und bestand entweder aus zufälligen Ganzzahlen oder Zeichenfolgen. Für Zeichendaten entspricht Set Density der Zeichenfolgenlänge, während für numerische Daten der Bereich zufälliger Ganzzahlen auf 10^Set Density festgelegt wurde.
Datentyp:
|
Numerisch oder Zeichen
|
Anzahl Set-Elemente:
|
25, 100, 1000, 1e4, 1e5
|
Anzahl der Sätze:
|
2, 3, 5, 10, 25 (nur 2 wird für Differenz verwendet)
|
Dichte einstellen:
|
2, 3, 4, 5, 6
Gibt die Zeichenfolgenlänge oder 10 an X ganze Zahlen
|
Die folgende Grafik fasst die Ergebnisse zusammen. Die farbigen Quadrate entsprechen Fällen, in denen ein Ansatz in mindestens 9 der 10 Wiederholungen eine bessere Zeit zeigte. Alles andere wurde als Unentschieden gewertet. Alle bis auf 15 der 750 Fälle hatten einen eindeutigen Ausgang, wobei Associative Arrays etwa doppelt so oft die Nase vorn hatten. Außerdem werden die Durchschnittszeiten für die schnellere Methode sowie die Verbesserung der Verarbeitungszeit (langsamere Zeit/schnellere Zeit) angezeigt. Diese Werte werden nur angezeigt, wenn die mittlere absolute Differenz (die mittlere Differenz zwischen den 10 Läufen innerhalb einer Reihe von Bedingungen) 0,5 Sekunden oder mehr betrug. Während also der Associate-Array-Ansatz häufiger gewann, betrugen viele Zeitunterschiede eine halbe Sekunde oder weniger. Die bemerkenswerte Ausnahme besteht für Schnittmengen mit ganzzahligen Daten: Der Unterschied scheint zuzunehmen, wenn die Datensätze größer werden und die Anzahl der Sätze zunimmt. Das Gegenteil gilt jedoch für Zeichendaten, wo Datentabellenoperationen erheblich schneller sind. Aus den Ergebnissen können wir ersehen, dass Tabellenoperationen für nahezu alle Zeichendatentypen und numerischen Daten mit Sätzen von mehr als 100 Mitgliedern die richtige Wahl für Union sind. Vollständige Ergebnisse finden Sie in Herausforderung 9 Ergebnisse 1.JMP und sind zusammengefasst in Gewinner 1.JMP .

Und wir könnten möglicherweise schneller vorgehen (zumindest bei ganzzahligen Daten). In der vorherigen Simulation war der assoziative Array-Ansatz den Tabellenoperationen unter allen Bedingungen mit Schnitt- und Differenzbedingungen für numerische Daten überlegen. Wenn wir jedoch einen Look-up-Matrix-Ansatz verwenden, verringert sich dieser Vorteil. Ein Beispiel für diesen Ansatz findet sich in Legen Sie Operationen mit matrices.JSL fest und ist zu verdanken @brady_brady . Die folgende Grafik zeigt, dass der Matrixansatz für Sätze von 10.000 oder mehr unter allen Bedingungen einen kleinen (<0,5 Sekunden) Vorteil für Differenz und in etwa der Hälfte der Fälle einen Vorteil für Schnittmenge aufweist. Aufgrund der Einfachheit des Assoziativen-Array-Ansatzes würde ich ihn jedoch jedem anderen Ansatz vorziehen. Die vollständigen Ergebnisse der Simulation finden Sie in Herausforderung 9 Ergebnisse 2.JMP und sind zusammengefasst in Gewinner 2.JMP . Die Differenzroutinen für Tabellenoperationen und Matrizen lassen sich problemlos auf mehr als zwei Datensätze erweitern.
