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)?
Điều đó sẽ đúng. – screenmutt
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ù –
@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