Loại bỏ trùng lặp hiệu quả và với chi phí bộ nhớ thấp


9

Tôi muốn lọc một cách hiệu quả một danh sách các số nguyên cho các bản sao theo cách mà chỉ tập hợp kết quả cần được lưu trữ.

Một cách này có thể được nhìn thấy:

  • chúng tôi có một loạt các số nguyên với N lớn (nói 2 40 )S={1,,N}N240
  • chúng ta có một hàm với, được cho là có nhiều va chạm (hình ảnh được phân bố đồng đều trong S )f:SSS
  • sau đó chúng ta cần lưu trữ , đó là { f ( x ) | x S }f[S]{f(x)|xS}

Tôi có một ước tính khá chính xác (xác suất) về những gì là, và do đó có thể phân bổ cấu trúc dữ liệu trước (nói | f [ S ] |2 30 ).|f[S]||f[S]|230

Tôi đã có một vài ý tưởng, nhưng tôi không chắc đâu là cách tiếp cận tốt nhất:

  • một bitet nằm ngoài câu hỏi vì bộ đầu vào không vừa với bộ nhớ.
  • một bảng băm, nhưng (1) nó yêu cầu một số chi phí bộ nhớ, giả sử 150% của và (2) bảng phải được khám phá khi được xây dựng đòi hỏi thêm thời gian vì chi phí bộ nhớ.|f[S]|
  • một loại "trên đường bay", tốt nhất là với độ phức tạp (loại không so sánh). Về điều đó, tôi không chắc sự khác biệt chính giữa loại xôflashsort là gì .O(N)
  • một mảng đơn giản với cây tìm kiếm nhị phân, nhưng điều này đòi hỏi thời gian .O(Nlog|f[S]|)
  • có thể sử dụng các bộ lọc Bloom hoặc cấu trúc dữ liệu tương tự có thể hữu ích trong việc thư giãn (với các kết quả dương tính giả) của vấn đề.

Một số câu hỏi về stackoverflow dường như giải quyết vấn đề này ( /programming/12240997/sorting-array-in-on-run-time , /programming/3951547/java -array-looking-trùng lặp ), nhưng dường như không có gì phù hợp với yêu cầu của tôi.


2
Bạn có cần liệt kê f [S] (bất kể đó là gì) hoặc để có thể nhanh chóng cho biết một số x có trong đó không?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Tôi tin rằng, vì không có cấu trúc rõ ràng nào có thể được tìm thấy trong f [S], hai giải pháp là tương đương nhau.
doc

N(11/e)N256

1
O(Nlog|f[S]|)O(NlogN)

1
N256S

Câu trả lời:


1

Tại sao không bin và chuỗi?

n=k+mA2kA[y]y0[2my,2m(y+1)1]1x<2nx=2my+zykzmzxy

  • A[y]=zx

  • A[y]zA[y]

  • zyA[y]z

f(S)Azyx=2my+z

2kN

2nA22kmk2knk

km=nk

Amk


1
Tôi nghĩ rằng đoạn thứ hai đến cuối cùng là đoạn trung tâm ở đây, và có lẽ nên ở trên cùng (như ý tưởng). Tôi không biết thuật ngữ "bin và chuỗi" (mặc dù nó có ý nghĩa sau khi đọc bài viết). Ý tưởng này có thể được mở rộng để thử .
Raphael

Θ(n2)

@einpoklum Câu trả lời này mô tả rõ ràng các điều kiện trong đó giải pháp có hiệu quả.
whuber
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.