5

Cho một mảng các số nguyên, viết một phương thức trả về cặp bài độc đáo để tăng thêm dữ liệu 100.Độ phức tạp Big-O của mã của tôi là gì?

Ví dụ:

sample_data = [0, 1, 100, 99, 0, 10, 90, 30, 55, 33, 55, 75, 50, 51, 49, 50, 51, 49, 51] 
sample_output = [[1,99], [0,100], [10,90], [51,49], [50,50]] 

Tôi đã giải quyết vấn đề này vào cuối tuần này và trong khi giải pháp của tôi dường như khả năng mở rộng và hiệu quả, tôi muốn xác định độ phức tạp thời gian tồi tệ nhất của giải pháp của tôi là gì?

Đây là giải pháp của tôi:

def solution(arr) 
    res = [] 
    h = Hash.new 

    # this seems to be O(N) 
    arr.each do |elem| 
    h[elem] = true 
    end 

    # how do I determine what Time complexity of this could be? 
    arr.each do |elem| 
    if h[100-elem] 
     h[100-elem] = false 
     h[elem] = false 
     res << [elem, 100-elem] 
    end 
    end 
    res 
end 

Nếu cả hai vòng là O (N) mỗi, và tôi thêm chúng lên: O (N + N), điều này sẽ bằng O (2N) và lấy 2 để được một hằng số, tôi có thể giả định giải pháp của tôi là O (N)?

+3

Điều đó sẽ đúng. – screenmutt

+0

Tôi nghĩ giả định của bạn về cơ bản là chính xác. Điều đó cũng giả định rằng các phần tử có thể âm (và trên 100) cho điều này là có ý nghĩa - nếu không chỉ sao chép đầu vào ban đầu có bất kỳ chi phí chia tỷ lệ nào và mọi thứ khác có thể được coi là chi phí cố định khi bạn điền tất cả các phím 0 .. 100. Về mặt kỹ thuật, 'h [elem] = true' không phải là' O (1) '(mà nhiều người dường như giả định) nhưng' O (log (N)) 'do đó độ phức tạp tổng thể của bạn có lẽ là' O (Nlog (N)) 'trường hợp xấu nhất - bạn chỉ thấy rằng nếu bạn bơm trong mảng với hàng triệu số nguyên mặc dù –

+1

@NeilSlater Bạn không chính xác. 'h' là một bản đồ băm mà tìm kiếm là thời gian tuyến tính. [Wiki] (http://en.wikipedia.org/wiki/Hash_table) – screenmutt

Trả lời

4

Bạn là chính xác. Big-O của mã này sẽ là O(n) nếu bạn xem xét thời gian chạy được tính khấu hao của tìm kiếm/chèn băm.

Nếu bạn thực hiện trường hợp tìm kiếm/chèn băm đúng nhất (O(n)), thì đó sẽ là O(n^2).

See Wikipedia on Hash Tables

0

Câu hỏi đặt ra có thể được hỏi về mức độ phức tạp thời gian của băm, nhưng đối với các vấn đề cụ thể, băm mà sẽ thực hiện tốt hơn như là một mảng của bools lập chỉ mục của 0..sum đầu vào (100 trong trường hợp này). Điều đó sẽ có thời gian liên tục tốt nhất, tồi tệ nhất và trung bình.

Cách tiếp cận đó đơn giản hơn để tính toán độ phức tạp của O (N).

+0

Vâng, đó là một cách khác để triển khai giải pháp. Tôi cũng đã nghĩ về cách tiếp cận này. –

+0

Tôi nghĩ bạn sẽ thấy nó nhanh hơn trong thực tế (và một tính toán phức tạp hơn). Các mảng thưa thớt giao dịch một không gian nhỏ (hầu như không có ở mức thấp N) cho tốc độ. – danh

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