2010-10-09 40 views
5

Một tệp có chứa số lượng lớn (ví dụ.10 tỷ) các chuỗi và bạn cần phải tìm các chuỗi trùng lặp. Bạn có sẵn N hệ thống. Bạn sẽ tìm thấy các bản sao như thế nàoTìm các chuỗi trùng lặp trong một tệp lớn

+1

Đây có phải là bài tập về nhà không? Điều này nghe có vẻ như bài tập về nhà. – SoapBox

Trả lời

4

Tách tệp thành các phần N. Trên mỗi máy, nạp càng nhiều phần vào bộ nhớ càng tốt, và sắp xếp các chuỗi. Viết các khối này vào dung lượng lưu trữ trên máy đó. Trên mỗi máy, hợp nhất các khối thành một dòng duy nhất, sau đó hợp nhất luồng từ mỗi máy vào một luồng có chứa tất cả các chuỗi theo thứ tự sắp xếp. So sánh từng chuỗi với chuỗi trước đó. Nếu chúng giống nhau, nó trùng lặp.

+0

Để hợp nhất các đoạn thành một dòng, bạn sẽ phải tải tất cả các bản ghi trong bộ nhớ. Đối với tệp bản ghi 1 triệu, tất cả các bản ghi 1 triệu sẽ phải nằm trong bộ nhớ ở bước hợp nhất cuối cùng trong thuật toán ở trên phải không? Nếu có, thì đánh bại mục đích. –

+0

@AndyDufresne "Để hợp nhất các đoạn thành một dòng, bạn sẽ phải tải tất cả các bản ghi trong bộ nhớ." Không, bạn sẽ không. Bạn chỉ cần đủ bộ nhớ để tải chuỗi tiếp theo từ mỗi đoạn cùng một lúc, để so sánh chúng. Khi so sánh đã được thực hiện, chuỗi tiếp theo sẽ chiếm không gian bộ nhớ đó. – erickson

+0

Tôi không hiểu thuật toán hợp nhất của bạn. Giả sử chúng ta có 1 triệu bản ghi và chỉ có 5k bản ghi có thể được nạp vào bộ nhớ. Từ những gì tôi đã hiểu, đầu tiên tôi cần phải chia nhỏ tập tin thành từng phần với 5K bản ghi. Sau đó sắp xếp tất cả các bản ghi trong mỗi tệp bản ghi 5k và ghi lại. Để hợp nhất hai tệp bản ghi 5k, tôi sẽ phải tải 10k bản ghi trong bộ nhớ phải không? Nếu đây không phải là ý của bạn, bạn có thể giải thích các bước để tìm bản ghi trùng lặp trong tệp bản ghi 1 triệu với giới hạn bộ nhớ chỉ tải 5k bản ghi. –

8

Câu trả lời của erickson có lẽ là câu trả lời có thể xảy ra bởi bất kỳ ai đặt câu hỏi này.

Bạn có thể sử dụng mỗi máy N như một cái xô trong một Hashtable:

  • cho mỗi chuỗi, (nói chuỗi số i theo thứ tự) tính toán một hàm băm vào nó, h.
  • gửi các giá trị của i và h tới số máy n để lưu trữ, trong đó n = h% N.
  • từ mỗi máy, truy xuất danh sách tất cả giá trị băm mà đã nhận được nhiều hơn một chỉ mục với danh sách các chỉ mục.
  • kiểm tra tập hợp các chuỗi có giá trị băm bằng nhau để xem liệu chúng có thực sự bằng nhau hay không.

Thành thật mà nói, với 10 tỷ chuỗi, bạn có thể làm điều này một cách đáng tin cậy trên 1 PC. Các hashtable có thể chiếm một cái gì đó như 80-120 GB với một băm 32 bit, tùy thuộc vào thực hiện hashtable chính xác. Nếu bạn đang tìm kiếm một giải pháp hiệu quả, bạn phải cụ thể hơn một chút về "máy", bởi vì nó phụ thuộc vào dung lượng lưu trữ của mỗi máy và chi phí tương đối của truyền thông mạng.

Các vấn đề liên quan