O (N) giải pháp (BloomFilters):
Đây là một giải pháp sử dụng bộ lọc nở (thực hiện là từ Thư viện ổi)
public static <T> T findCommon_BloomFilterImpl(T[] A, T[] B, Funnel<T> funnel) {
BloomFilter<T> filter = BloomFilter.create(funnel, A.length + B.length);
for (T t : A) {
filter.put(t);
}
for (T t : B) {
if (filter.mightContain(t)) {
return t;
}
}
return null;
}
sử dụng nó như thế này:
Integer j = Masking.findCommon_BloomFilterImpl(new Integer[]{12, 2, 3, 4, 5222, 622, 71, 81, 91, 10}, new Integer[]{11, 100, 15, 18, 79, 10}, Funnels.integerFunnel());
Assert.assertNotNull(j);
Assert.assertEquals(10, j.intValue());
Chạy trong thời gian O (N) kể từ khi tính toán hash cho Integer là khá thẳng về phía trước. Vì vậy, vẫn O (N) nếu bạn có thể làm giảm tính toán băm của các phần tử của bạn thành O (1) hoặc một O nhỏ (K) trong đó K là kích thước của mỗi phần tử.
O (N.LogN) giải pháp (phân loại và lặp lại):
Sắp xếp và các iterating qua mảng sẽ dẫn bạn đến một O (log N * (N)) giải pháp:
public static <T extends Comparable<T>> T findCommon(T[] A, T[] B, Class<T> clazz) {
T[] array = concatArrays(A, B, clazz);
Arrays.sort(array);
for (int i = 1; i < array.length; i++) {
if (array[i - 1].equals(array[i])) { //put your own equality check here
return array[i];
}
}
return null;
}
concatArrays(~)
có trong O (N) tất nhiên. Arrays.sort(~)
là triển khai bi-pivot của QuickSort với độ phức tạp trong O (N.logN) và lặp lại qua mảng lần nữa là O (N).
Vì vậy, chúng tôi có O ((N + 2) .logN) ~> O (N.logN).
Giải pháp trường hợp chung (với điều kiện "trong k" của vấn đề của bạn) tốt hơn của bạn. Nó nên được xem xét cho k "gần" N trong trường hợp chính xác của bạn.
'if (A [i] == B [j])' chỉ hoạt động cho các kiểu nguyên thủy. Đối với các loại tham chiếu, có sự khác biệt giữa bình đẳng và nhận dạng. Bạn không cho chúng tôi biết những gì 'A' và' B' là chính xác. – jlordo
Tôi thấy 2 cách giải thích cho 'k distance': a) Bạn được đảm bảo rằng khoảng cách giữa một mục xuất hiện trong hai mảng là' k' hoặc nhỏ hơn, hoặc b) Nếu một phần tử được lặp lại nhưng khoảng cách lớn hơn ' k', không báo cáo nó lặp đi lặp lại. Hai cách giải thích có thể dẫn đến các kết quả và cách triển khai khác nhau, cái nào là đúng? – SJuan76
ok, khoảng cách giữa chúng là k hoặc nhỏ hơn. – user1841492