Nếu bạn muốn * câu trả lời nhanh nhất:
- Sắp xếp một mảng - thời gian được N log N.
- Đối với mỗi phần tử trong mảng thứ hai, hãy tìm kiếm phần tử đầu tiên. Nếu bạn tìm thấy nó, thêm 1 vào một mảng đồng hành; nếu không thêm 0 - thời gian là N log N, sử dụng N không gian.
- Đối với mỗi số không khác, sao chép mục nhập tương ứng vào mảng tạm thời, nén nó sao cho nó vẫn được sắp xếp - thời gian là N.
- Đối với mỗi phần tử trong mảng thứ ba, tìm kiếm mảng tạm thời; khi bạn tìm thấy một hit, dừng lại. Thời gian là ít hơn N log N.
Dưới đây là mã trong Scala ví dụ minh họa:
import java.util.Arrays
val a = Array(1,5,2,3,14,1,7)
val b = Array(3,9,14,4,2,2,4)
val c = Array(1,9,11,6,8,3,1)
Arrays.sort(a)
val count = new Array[Int](a.length)
for (i <- 0 until b.length) {
val j =Arrays.binarySearch(a,b(i))
if (j >= 0) count(j) += 1
}
var n = 0
for (i <- 0 until count.length) if (count(i)>0) { count(n) = a(i); n+= 1 }
for (i <- 0 until c.length) {
if (Arrays.binarySearch(count,0,n,c(i))>=0) println(c(i))
}
Với một chút phức tạp hơn, bạn có thể sử dụng không gian thêm với chi phí được thậm chí phá hoại hơn mảng ban đầu của bạn, hoặc bạn có thể tránh chạm vào mảng ban đầu của bạn ở tất cả tại các chi phí của một không gian N.
Chỉnh sửa: * như các nhận xét đã chỉ ra, bảng băm nhanh hơn cho đầu vào không đảo ngược. Đây là "trường hợp xấu nhất nhanh nhất". Trường hợp xấu nhất có thể không được như vậy không trừ khi bạn sử dụng một thuật toán băm thực sự tốt, mà cũng có thể ăn lên nhiều thời gian hơn so với sắp xếp của bạn. Ví dụ: nếu bạn nhân tất cả các giá trị của mình với 2^16, hàm băm nhỏ (ví dụ: chỉ sử dụng số nguyên bitmasked làm chỉ mục) sẽ va chạm mọi lúc trên danh sách ngắn hơn 64k ....
Nguồn
2010-03-10 17:34:17
Bạn có thể làm rõ nếu một trong các mảng có thể có yếu tố lặp lại hay không? Ví dụ, bạn có thể có 'A = {1, 1, 1, 1, 1}; B = {2, 3, 4, 5, 1}; C = {2, 2, 2, 2, 1}; '? – IVlad
Vui lòng đọc kỹ qn. –
Ngoài ra, bạn nói chỉ có một phần tử phổ biến trong ba mảng. Điều đó có nghĩa là chỉ có một phần tử xuất hiện trong cả ba mảng và chỉ hai trong ba mảng có thể có các phần tử phổ biến khác, hoặc có thể hai trong số ba mảng không có phần tử phổ biến nào khác. – IVlad