Thuật toán P2 là một tìm kiếm tốt đẹp. Nó hoạt động bằng cách thực hiện một số ước tính của lượng tử, cập nhật chúng định kỳ và sử dụng phép nội suy bậc hai (không phải tuyến tính, không phải khối) để ước lượng lượng tử. Các tác giả cho rằng phép nội suy bậc hai hoạt động tốt hơn ở đuôi so với phép nội suy tuyến tính và khối sẽ trở nên quá phức tạp và khó khăn.
Bạn không nói chính xác cách tiếp cận này thất bại đối với dữ liệu "đuôi nặng" của bạn, nhưng thật dễ đoán: ước tính lượng tử cực đoan cho phân phối đuôi nặng sẽ không ổn định cho đến khi một lượng lớn dữ liệu được thu thập. Nhưng đây sẽ là một vấn đề (ở mức độ thấp hơn) ngay cả khi bạn đã lưu trữ tất cả dữ liệu, vì vậy đừng mong đợi phép màu!
Ở bất kỳ giá nào, tại sao không đặt các dấu phụ - hãy gọi chúng là và - với điều bạn chắc chắn là lượng tử sẽ nằm và lưu trữ tất cả dữ liệu nằm giữa và ? Khi bộ đệm của bạn đầy, bạn sẽ phải cập nhật các điểm đánh dấu này, luôn giữ . Một thuật toán đơn giản để thực hiện điều này có thể được tạo ra từ sự kết hợp của (a) ước tính P2 hiện tại của lượng tử và (b) số lượng lưu trữ của số lượng dữ liệu nhỏ hơn và số lượng dữ liệu lớn hơnx0x 0 x 6 x 0 ≤ x 6 x 0 x 6x6x0x6x0≤ x6x0x6. Theo cách này, bạn có thể, với độ chắc chắn cao, ước tính lượng tử cũng như nếu bạn có sẵn toàn bộ dữ liệu, nhưng bạn chỉ cần một bộ đệm tương đối nhỏ.
Cụ thể, tôi đang đề xuất cấu trúc dữ liệu để duy trì thông tin một phần về chuỗi giá trị dữ liệu . Ở đây, là danh sách được liên kếtn x 1 , x 2 , Mạnh , x n y( k , y , n )nx1, x2, Lọ , xny
y =( x( n )[ k + 1 ]≤ x( n )[ k + 2 ]≤ ⋯ ≤ x( n )[ k + m ]) .
Trong ký hiệu này biểu thị nhỏ nhất trong số các giá trị được đọc cho đến nay. là một hằng số, kích thước của bộ đệm . i th n x m yx( n )[ i ]tôithứn xmy
Thuật toán bắt đầu bằng cách điền với các giá trị dữ liệu đầu tiên gặp phải và đặt chúng theo thứ tự được sắp xếp, nhỏ nhất đến lớn nhất. Đặt là lượng tử được ước tính; ví dụ: = 0,99. Khi đọc có ba hành động có thể xảy ra: m q q x n + 1ymqqxn + 1
Nếu , tăng . kxn + 1< x( n )[ k + 1 ]k
Nếu , không làm gì cả.xn + 1> x( n )[ k + m ]
khác, chèn vào . yxn + 1y
Trong mọi trường hợp, tăng .n
Quy trình chèn đặt vào theo thứ tự được sắp xếp và sau đó loại bỏ một trong các giá trị cực trị trong : y yxn + 1yy
Nếu , sau đó xóa khỏi và tăng ;x ( n ) [ k + 1 ] y kk + m / 2 < n qx( n )[ k + 1 ]yk
Nếu không, hãy xóa khỏi . yx( n )[ k + m ]y
Với điều kiện là đủ lớn, quy trình này sẽ đóng khung lượng tử thực của phân phối với xác suất cao. Ở bất kỳ giai đoạn nào, nó có thể được ước tính theo cách thông thường theo và , có khả năng sẽ nằm trong . (Tôi tin rằng chỉ phải chia tỷ lệ như căn bậc hai của lượng dữ liệu tối đa ( ), nhưng tôi chưa thực hiện một phân tích nghiêm ngặt nào để chứng minh điều đó.) Ở bất kỳ tỷ lệ nào, thuật toán sẽ phát hiện liệu nó có thành công hay không (bởi so sánh và với ).n x ( n ) [ ⌊ q n ⌋ ] x ( n ) [ ⌈ q n ⌉ ] y m N k / n ( k + m ) / n qmnx( n )[⌊qn⌋]x(n)[⌈qn⌉]ymNk/n(k+m)/nq
Thử nghiệm với tối đa 100.000 giá trị, sử dụng và (trường hợp khó nhất) cho thấy thuật toán này có tỷ lệ thành công 99,5% trong việc lấy giá trị đúng của . Đối với luồng có giá trị , yêu cầu bộ đệm chỉ có hai triệu (nhưng ba hoặc bốn triệu sẽ là lựa chọn tốt hơn). Sử dụng danh sách liên kết đôi được sắp xếp cho bộ đệm yêu cầu = trong khi xác định và xóa tối đa hoặc tối thiểu là các hoạt động . Việc chèn tương đối đắt tiền thường chỉ cần được thực hiện q=0,5x ( n ) [ ⌊ q n ⌋ ] N=10 12 O(log( √m=2N−−√q=.5x(n)[⌊qn⌋]N=1012O(log(N−−√))O(log(N))O(1)O(N−−√)lần Do đó, chi phí tính toán của thuật toán này là trong thời gian và trong lưu trữ.O(N+N−−√log(N))=O(N)O(N−−√)