Die effizienteste Methode, um Bestellungen abzugleichen

8

Betrachten Sie zwei 2D-Arrays (das Kaufarray) und (das Verkaufsarray), wobei jedes -Element einem Array von Gleitkommawerten und jedem der Gleitkommawerte zugeordnet ist. ist wiederum einem Array von ganzen Zahlen zugeordnet.B.ichjS.ichjichth

Zum Beispiel

B = [ 
  0001 => [ 32.5 => {10, 15, 20}, 
            45.2 => {48, 16, 19}, 
            ...,
            k1
          ], 
  0002 => [ 35.6 => {17, 35, 89}, 
            68.7 => {18, 43, 74}, 
            ...,
            k2
          ] 
] 

und ähnlich für das Verkaufsarray.

Dies ähnelt einem Auftragsassoziationssystem einer Börse

BuyOrderBook = [
                 CompanyName => [
                                 Price1 => [Qty1, Qty2...],
                                 Price2 => [Qty1, Qty2...]
                                ]
                 SecondCompany = [...]
               ]

Was ist der schnellste bekannte Weg, um das folgende Problem zu lösen:

Eingabe: Array kaufen , Array verkaufen Problem: Entscheide, ob es und mit und .B.S.
(c1p1q1)B.(c2p2q2)S.q1,q2>0p2p1

Kurz gesagt, was ist der fetteste Weg, um Bestellungen für einen Umtausch abzugleichen?

Update als Antwort auf Kommentare

Nehmen wir an, MSFT hat 25 Aktien zu einem Preis von 60 USD zu verkaufen, und es gibt einen Käufer, der bereit ist, 61 USD für 10 Aktien von MSFT anzubieten. Dann erhält der Käufer 10 Aktien zu 60 USD und das Kaufauftragsbuch wird leer, während das Verkaufsauftragsbuch jetzt mit einer neuen Menge aktualisiert wird - 15 Aktien zu 60 USD .

Nehmen wir nun den umgekehrten Fall: MSFT hat 25 Aktien zu einem Preis von 60 USD zu kaufen, und es gibt einen Verkäufer, der bereit ist, 61 USD für 10 Aktien von MSFT zu erhalten. Dann wird der Handel nicht ausgeführt, da der Verkäufer ein Minimum von 61 USD verlangt und der Käufer ein Maximum von 60 USD anbietet . Die Bestellungen werden nun gespeichert und warten, bis neue Bestellungen eingehen.

(Dies ist das Limit-Order-Prinzip , bei dem der Verkäufer den Mindestpreis angibt, zu dem er zu verkaufen bereit ist, und der Käufer den Höchstpreis angibt, zu dem er zu kaufen bereit ist.)

Nach der Ausführung ist das Verkaufsauftragsbuch (25-10)[email protected], während das Kaufauftragsbuch leer ist (10-10) = 0.

check123
quelle
Ich habe stark bearbeitet; Bitte überprüfen Sie, ob die Bedeutung immer noch die von Ihnen beabsichtigte ist. Ist "Stapel" wirklich das Wort, das Sie hier verwenden möchten? Ich denke, die Datenstruktur ist kein Stapel, also ist es ein Domänenausdruck? Beachten Sie bei der Frage, dass das von Ihnen angegebene Entscheidungsproblem und das Finden aller Übereinstimmungen nicht unbedingt gleich schwierig sind. Insbesondere können Übereinstimmungen zu Konflikten führen.
Raphael
q1,q2
@Raphael 'Übereinstimmungen können in Konflikt geraten' Ein Beispiel?
Check123
1) Stapel erlauben normalerweise keinen Zugriff auf das oberste Element. Du willst zufälligen Zugriff, oder? 2) Es kann zwei Kaufaufträge geben, die beide zum gleichen Verkaufsauftrag passen, aber nicht beide erfüllt werden können.
Raphael
@ Raphael 1) Oh! Ja, vielleicht ist Array ein besseres Wort. 2) Wenn es Übereinstimmungskonflikte gibt, werden diese nach dem FIFO-Prinzip gelöst. Die ältere Reihenfolge wird bevorzugt (die meisten Börsen folgen diesem Prinzip)
check123

Antworten:

5

Pflegen Sie Ihr Bestellbuch als eine Reihe von Unternehmen. Halten Sie für jedes Unternehmen eine Prioritätswarteschlange mit Preisen (max für Kauf und min für Verkauf). Halten Sie für jeden Preis eine Warteschlange mit Bestellungen.

Um zu überprüfen , für passende Aufträge, für jedes Unternehmen, Anruf find-min()und find-max()auf dem Unternehmen in den Sell - Array und kaufen Array die besten Kauf- / Verkaufspreise zu finden. Wenn max> min, versuchen Sie, die Bestellung zu erfüllen. Um die Bestellung zu erfüllen, ziehen Sie Elemente aus Ihren Kauf- und Verkaufswarteschlangen für dieses Unternehmen und diesen Preis, bis eine Ihrer Preiswarteschlangen leer ist. Wenn die Preiswarteschlange leer ist, löschen Sie das entsprechende Element aus der Prioritätswarteschlange und führen Sie die Prüfung erneut durch.

Ö(Logpich)pichich

Joe
quelle