Thuật toán cho các số xảy ra thường xuyên nhất 'k' '


19

Tôi đã tìm kiếm thuật toán (phát trực tuyến ??) hiệu quả nhất cho tôi biết các phần tử xảy ra thường xuyên nhất trong luồng dữ liệu tại bất kỳ thời điểm nào. Bài đăng này: "Phân chia và chinh phục" thuật toán luồng dữ liệu khiến tôi quan tâm đến nó.

Ví dụ: giả sử có các số: (4,3,5,1,6,2,4,3,3,8,9,1) và tôi truy vấn 3 số xảy ra thường xuyên nhất (giả sử), thì tôi nên lấy (3,4,1) làm câu trả lời.

Tôi đã thử tìm kiếm trực tuyến, nhưng không thể tìm thấy bất kỳ nơi nào đưa ra cách tiếp cận và nói rằng đó là cách tốt nhất. Một giải pháp tầm thường sẽ là sử dụng một đống hoặc cây nhị phân cân bằng, nhưng tôi nghĩ có một cách tốt hơn và tôi muốn biết liệu nó có được ghi lại ở đâu đó không.

Chỉnh sửa: Tôi đang tìm kiếm một thuật toán luôn đưa ra câu trả lời chính xác trái ngược với thuật toán phân bổ (nhiều trong số đó bật lên trong kết quả tìm kiếm) dựa trên phân phối dữ liệu theo cách này hay cách khác


Trên thực tế, có ba loại thuật toán: chính xác, gần đúng và "phụ thuộc dữ liệu". Bạn đã loại trừ loại cuối cùng, nhưng các thuật toán gần đúng KHÔNG phụ thuộc vào phân phối dữ liệu được phép? như tôi đã chỉ ra, nếu không, bạn sẽ gặp rắc rối vì các giới hạn thấp hơn đã biết cho vấn đề này trong cài đặt luồng.
Suresh Venkat

1
Tôi tò mò liệu các thuật toán sử dụng bộ nhớ hạn chế (thuật toán phát trực tuyến) có thực sự làm được điều tôi muốn hay không và dường như chúng không thể như bạn đã chỉ ra. Ngoài ra, liệu một thuật toán chính xác không phát trực tuyến được biết có giải quyết được vấn đề trong thời gian trường hợp xấu nhất được bảo đảm O (n) hay không, được đề cập ở đây (được trích dẫn bởi bài báo của Cormode và Hadjileftheriou từ liên kết bạn cung cấp): citeseerx.ist.psu. edu / viewdoc / tóm tắt? doi = 10.1.1.106.7889
dhruvbird

Câu trả lời:


20

k=1o(n)

n/k

kk


1
+1. Tôi nghĩ rằng> 50% thuật toán thời gian là một thuật toán nổi tiếng (thuật toán phần tử đa số) như bạn đã đề cập
dhruvbird

2
Cảm ơn!! Bài báo của Cormode và Hadjileftheriou mà bạn đề cập đã trích dẫn bài báo này: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.106.7889 có cùng kỹ thuật mà tôi đang nghĩ đến. Nó duy trì 2 danh sách liên kết; một theo tần số và trong đó một danh sách khác của tất cả các yếu tố có cùng tần số.
dhruvbird

bạn có thể giải thích về thuật toán hơn 50 phần trăm không? và câu đố google? Tôi không thể làm theo lý luận cẩu thả này vì bạn vừa chạm vào nó và không hoàn toàn sử dụng "mánh khóe nổi tiếng". Cảm ơn.


Đây là một lời nhận xét (không đủ uy tín) vào liên kết Suresh Venkat của userweb.cs.utexas.edu/users/misra/scannedPdf.dir/... : Dường như các thuật toán được trình bày ở đó đòi hỏi một đường chuyền thứ hai thông qua các dữ liệu, mà không được phép đây. Trên thực tế, tôi không thấy thuật toán một lượt với các yêu cầu không gian O (1) có thể tồn tại như thế nào.
TonyK

2

Tôi cũng khuyên bạn nên đọc phần 8.1.3 "Khai thác mô hình thường xuyên trong luồng dữ liệu" của cuốn sách sau:

Gia Hán Han, Micheline Kamber. Khai thác dữ liệu --- Khái niệm và kỹ thuật, Ấn bản thứ hai, Nhà xuất bản Morgan Kaufmann , 2006.

Nó giới thiệu một thuật toán, được gọi là Đếm tổn thất , xấp xỉ các mục thường xuyên (các mục có hỗ trợ cao hơn một số min_support ) với độ chính xác tùy ý.

Không chính xác những gì bạn muốn, nhưng tôi nghĩ nó có thể giúp đỡ.


có lẽ bạn có thể giúp tôi về câu hỏi của tôi ở đây
Ben
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.