Chúng tôi nhận các tệp dữ liệu ~ 50GB này bao gồm 16 mã byte và tôi muốn tìm bất kỳ mã nào xảy ra 1/2% thời gian hoặc hơn. Có cách nào tôi có thể làm điều đó trong một lần vượt qua dữ liệu?Thuật toán ghi nhật ký
Chỉnh sửa: Có rất nhiều mã - có thể mọi mã đều khác nhau.
EPILOGUE: Tôi đã chọn Darius Bacon là câu trả lời hay nhất, vì tôi nghĩ thuật toán tốt nhất là sửa đổi phần tử đa số mà anh ta liên kết. Thuật toán đa số có thể thay đổi để chỉ sử dụng một lượng nhỏ bộ nhớ - như 201 mã để nhận được 1/2% tôi nghĩ. Về cơ bản, bạn chỉ cần đi bộ trong luồng có tới 201 mã riêng biệt. Ngay sau khi bạn tìm thấy 201 mã riêng biệt, bạn thả một trong mỗi mã (khấu trừ 1 từ các quầy, quên bất kỳ thứ gì trở thành 0). Cuối cùng, bạn đã giảm nhiều nhất là N/201 lần, vì vậy bất kỳ mã nào xuất hiện nhiều lần hơn số đó vẫn phải ở xung quanh.
Nhưng đó là thuật toán hai lần, không phải là một. Bạn cần một đèo thứ hai để kiểm đếm số lượng ứng cử viên. Thật dễ dàng thấy rằng bất kỳ giải pháp nào cho vấn đề này phải sử dụng ít nhất 2 lượt (hàng loạt các phần tử đầu tiên bạn tải có thể khác nhau và một trong các mã đó có thể kết thúc chính xác 1/2%)
Cảm ơn sự giúp đỡ!
Giấy thú vị nhưng có vấn đề hơi khác. Tôi muốn một câu trả lời chính xác (mà tôi nghĩ bây giờ có thể được thực hiện). – Gwildore
Có một bài báo có câu trả lời chính xác, chứng tỏ phương pháp của nó có ý nghĩa tối ưu, nhưng tôi đang bỏ trống tên; đó là một vài năm và tôi không còn làm việc ở đó nữa. –
Điều này cung cấp cho tất cả các ứng cử viên, vì vậy bạn có thể thực hiện một vượt qua thứ hai đơn giản, chỉ đếm các ứng cử viên. – Svante