Cách hiệu quả nhất để khớp lệnh


8

Hãy xem xét hai mảng 2D (mảng mua) và (mảng bán) trong đó mỗi phần tử được liên kết với một mảng các giá trị dấu phẩy động và từng giá trị của dấu phẩy động, lần lượt, được liên kết với một loạt các số nguyên.BTôijSTôijTôith

Ví dụ

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
          ] 
] 

và tương tự cho các mảng bán.

Điều này giống như một hệ thống liên kết đặt hàng của một sàn giao dịch chứng khoán / hàng hóa

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

Cách nhanh nhất được biết để giải quyết vấn đề sau đây là gì:

Đầu vào: Mua mảng , Bán mảng Vấn đề: Quyết định thời tiết có và với và .BS
(c1p1q1)B(c2p2q2)Sq1,q2>0p2p1

Nói tóm lại, cách thức phù hợp nhất với các đơn đặt hàng để trao đổi là gì?

Cập nhật để phản hồi ý kiến

Hãy nói rằng, MSFT có 25 cổ phiếu @ 60 đô la sẽ được bán và có người mua sẵn sàng cung cấp 61 đô la cho 10 cổ phiếu MSFT. Sau đó, người mua nhận được 10 cổ phiếu @ $ 60 và sổ lệnh mua trở nên trống trong khi sổ lệnh bán bây giờ được cập nhật với số lượng mới - 15 cổ phiếu @ $ 60.

Bây giờ lấy trường hợp ngược lại, MSFT có 25 cổ phiếu @ 60 đô la để mua và có người bán sẵn sàng nhận 61 đô la cho 10 cổ phiếu MSFT. Sau đó, giao dịch sẽ không được thực hiện vì người bán yêu cầu tối thiểu 61 đô la và người mua đang cung cấp tối đa 60 đô la . Các đơn đặt hàng hiện được lưu trữ và chờ đợi cho đến khi nhận được đơn đặt hàng mới.

(Đây là nguyên tắc lệnh giới hạn , trong đó người bán chỉ định giá tối thiểu mà anh ta sẵn sàng bán và người mua chỉ định giá tối đa mà anh ta sẵn sàng mua).

Thực hiện bài, sổ đặt hàng bán sẽ là (25-10) = 15@86.5 trong khi sổ đặt mua sẽ trống (10-10) = 0.


Tôi đã chỉnh sửa rất nhiều; vui lòng kiểm tra xem ý nghĩa vẫn là ý nghĩa của bạn. "Stack" có thực sự là từ bạn muốn sử dụng ở đây không? Tôi đoán cấu trúc dữ liệu không phải là một ngăn xếp, vì vậy nó có phải là một biểu thức miền không? Đối với câu hỏi, lưu ý rằng vấn đề quyết định mà bạn nêu và tìm tất cả các kết quả khớp không nhất thiết phải khó như nhau; đặc biệt, các trận đấu có thể xung đột.
Raphael

@Raphael Đã thực hiện một thay đổi nhỏ trong báo cáo sự cố liên quan đến . Cấu trúc là một chồng trong đó các đơn đặt hàng mới được 'đẩy' vào sổ đặt hàng. Tuy nhiên, sự liên kết giữa công ty, giá cả và số lượng là quan trọng. Sửa đổi cấu trúc theo yêu cầu. q1,q2
kiểm tra123

@Raphael 'Các trận đấu có thể xung đột' Một ví dụ?
kiểm tra123

1) Ngăn xếp thường không cho phép truy cập bất kỳ phần tử nào ngoài phần tử trên cùng. Bạn muốn truy cập ngẫu nhiên, phải không? 2) Có thể có hai lệnh mua phù hợp với cùng một lệnh bán nhưng cả hai không thể hài lòng.
Raphael

@Raphael 1) Ôi! Có thể là Mảng là một từ tốt hơn 2) Nếu có xung đột
trùng

Câu trả lời:


5

Duy trì cuốn sách đặt hàng của bạn như là một mảng của các công ty. Đối với mỗi công ty, hãy giữ một hàng đợi ưu tiên về giá (tối đa cho mua và tối thiểu để bán). Đối với mỗi mức giá, giữ một hàng các đơn đặt hàng.

Để kiểm tra các đơn đặt hàng phù hợp, đối với mỗi công ty, hãy gọi find-min()find-max()vào công ty trong mảng bán và mua mảng để tìm giá mua / bán tốt nhất. Nếu tối đa> tối thiểu, sau đó cố gắng thực hiện theo thứ tự. Để thực hiện đơn hàng, hãy kéo các yếu tố ra khỏi hàng đợi mua và bán cho công ty đó và giá, cho đến khi một trong các hàng đợi giá của bạn trống. Khi hàng đợi giá trống, xóa phần tử tương ứng khỏi hàng ưu tiên của nó và thực hiện kiểm tra lại.

Chiến lược này chi phí thời gian không đổi trên mỗi đơn hàng và cho mỗi thay đổi giá, trong đó là số lượng giá cho công ty .Ôi(đăng nhậppTôi)pTôiTôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.