我的代码的Big-O复杂性是什么?

时间:2013-12-16 16:06:17

标签: ruby performance algorithm complexity-theory computer-science

给定一个整数数组,编写一个返回所有唯一对的方法,最多可加100个。

示例数据:

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]]

本周末我解决了这个问题,虽然我的解决方案似乎具有可扩展性和高效性,但我想确定解决方案的最坏情况时间复杂度是什么?

这是我的解决方案:

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

如果两个循环都是O(N),我将它们加起来:O(N + N),这将等于O(2N)并将2作为常数,我可以假设我的解决方案是O (N)?

2 个答案:

答案 0 :(得分:4)

你是对的。如果考虑散列搜索/插入的分摊运行时,此代码的Big-O将为O(n)

如果您采用哈希搜索/插入(O(n))的最坏情况,那么它将是O(n^2)

See Wikipedia on Hash Tables

答案 1 :(得分:0)

问题可能是询问哈希的时间复杂度,但对于特定问题,该哈希将更好地实现为由输入0..sum索引的bool数组(在本例中为100)。这将具有最佳,最差和平均情况下的恒定时间。

这种方法可以更简单地计算O(N)的复杂度。