2012-06-21 74 views
13

Với hai mảng, cách tìm phần tử tối đa chung cho cả hai mảng là gì?Tìm phần tử tối đa phổ biến trong hai mảng?

Tôi đã suy nghĩ về sắp xếp cả mảng (n log n) và sau đó thực hiện tìm kiếm nhị phân của mọi phần tử từ một mảng được sắp xếp (bắt đầu từ mảng lớn hơn) trong mảng khác cho đến khi kết hợp được tìm thấy.

ví dụ:

a = [1,2,5,4,3] 
b = [9,8,3] 

Maximum common element in these array is 3 

Chúng ta có thể làm tốt hơn so với n log n?

+1

Không phải là nó giúp sự phức tạp tổng thể, nhưng trong bước cuối cùng của bạn là tìm kiếm tuyến tính, với đầu ra khi bạn tìm thấy một giá trị quá nhỏ, có lẽ sẽ nhanh hơn tìm kiếm nhị phân. Mỗi lần bạn có thể khởi động lại từ nơi bạn đã rời khỏi lần trước (không phải từ đầu), bởi vì giá trị bạn đang tìm kiếm nhỏ hơn giá trị cuối cùng bạn tìm kiếm. Vì vậy, tổng thời gian dành cho tìm kiếm là O (kích thước của "mảng khác"), chia không đều giữa các phần tử của "một mảng được sắp xếp". Bạn cũng có thể thực hiện tìm kiếm nội suy và tương tự như vậy. –

Trả lời

10

Với một số không gian thừa, bạn có thể băm trong 1 mảng, sau đó thực hiện chứa trên mỗi phần tử của mảng khác theo dõi giá trị lớn nhất trả về giá trị đúng. Sẽ là O (n).

+2

Chỉ cần đánh tôi với nó. Tất nhiên, nếu hashes không phải là duy nhất, độ phức tạp thời gian có thể cao hơn một chút (xác minh rằng một hash match là một match thực sự sẽ yêu cầu tìm kiếm) ... nếu hashes là duy nhất, bạn phải chịu một O (n) chi phí lưu trữ. – Patrick87

7

Bạn có thể sử dụng không gian O(N).
Chỉ cần đi qua mảng đầu tiên và đặt tất cả các phần tử trong một số HashTable. Đây là O(N)
Sau đó, đi qua bản theo dõi mảng thứ hai của mức tối đa hiện tại và kiểm tra xem phần tử có nằm trong số HashTable hay không. Đây cũng là O(N). Vì vậy, tổng thời gian chạy là O(N)O(N) thêm không gian cho Ví dụ HashTable

trong Java:

public static int getMaxCommon(int[] a, int[] b){ 
    Set<Integer> firstArray = new HashSet<Integer>(Arrays.asList(a)); 
    int currentMax = Integer.MIN_VALUE; 
    for(Integer n:b){ 
    if(firstArray.contains(n)){ 
     if(currentMax < n){ 
       currentMax = n 
     } 
    } 
    } 
    return currentMax; 
} 
3

Trong khi nó phụ thuộc vào sự phức tạp thời gian của các hoạt động khác nhau trong ngôn ngữ cụ thể, làm thế nào về việc tạo ra bộ từ các mảng và tìm giá trị tối đa trong giao điểm của hai bộ? Đi theo thời gian phức tạp cho hoạt động trong Python, nó sẽ được, trung bình, O (n) cho các bài tập thiết lập, O (n) cho giao lộ, và O (n) cho việc tìm kiếm giá trị tối đa. Vì vậy, trường hợp trung bình sẽ là O (n).

Tuy nhiên! Trường hợp xấu nhất sẽ là O (len (a) * len (b)) -> O (n^2), vì sự phức tạp thời gian tồi tệ nhất của các giao điểm được thiết lập. Thông tin

More đây, nếu bạn quan tâm: http://wiki.python.org/moin/TimeComplexity

1

Nếu bạn đã biết một loạt các con số đó sẽ là trong mảng của bạn, bạn có thể thực hiện đếm sắp xếp, và sau đó thực hiện tìm kiếm nhị phân như bạn muốn. Điều này sẽ mang lại thời gian chạy O (n).

1

Mã giả:

sort list1 in descending order 
sort list2 in descending order 
item *p1 = list1 
item *p2 = list2 
while ((*p1 != *p2) && (haven't hit the end of either list)) 
    if (*p1 > *p2) 
    ++p1; 
    else 
    ++p2; 
// here, either we have *p1 == *p2, or we hit the end of one of the lists 
if (*p1 == *p2) 
    return *p1; 
return NOT_FOUND; 
+0

Có phải 'sắp xếp danh sách1 theo thứ tự giảm dần' một hoạt động' O (N) '? Tôi không nghĩ vậy.Trừ khi bạn đã tìm ra thuật toán phân loại 'O (N)' – Cratylus

+0

Trừ khi bạn đã phát hiện một thuật toán sắp xếp mới. Nó vẫn là O (n log n) cho sắp xếp + O (N) cho tổng thể quét = O (N log n). Tôi khá chắc chắn bạn không thể làm tốt hơn trừ khi bạn có thể đưa ra các giả định nhất định về thứ tự của các danh sách ngay từ đầu. – twalberg

+0

OP đã biết rằng anh ta có thể sử dụng sắp xếp như một bước xử lý trước với chi phí phân loại. OP là về phương pháp 'O (N)'. Nếu bạn phân loại nó rõ ràng là không, do đó nhận xét của tôi về việc tìm một bản phân loại mới – Cratylus

0

Không phải là một hoàn hảo, nhưng một giải pháp đơn giản, O (len (array1) + len (array2))

import sys 


def find_max_in_common(array1, array2): 
    array1 = set(array1) 
    array2 = set(array2) 

    item_lookup = {} 

    for item in array1: 
     item_lookup[item] = True 

    max_item = -sys.maxsize 

    intersection = False 

    for item in array2: 
     if not item_lookup.get(item, None): 
      continue 
     else: 
      intersection = True 
      if item > max_item: 
       max_item = item 

    return None if not intersection else max_item 
Các vấn đề liên quan