计算Ruby Array #uniq自己实现的时间复杂度

时间:2013-12-26 17:16:44

标签: ruby arrays complexity-theory time-complexity

我看到了this

我用不同的论点做到了这一点:

def uniq(arr)
  out = {}
  arr.each do |el|
    out[el] = nil
  end
  out.keys
end

此代码的连接复杂性是什么?如何改进?

更新

怎么样:

def uniq(arr)
  arr | []
end

1 个答案:

答案 0 :(得分:2)

函数的时间复杂度为O(n),因为它需要做的工作与数组的大小成线性比例。

你有两个循环arr.eachout.keys。每个的复杂度是O(n),因为每个循环体的复杂度是O(1)(即,需要在循环体内完成的工作与数组大小无关)。由于两个循环彼此独立,因此总复杂度为O(n)。

你的第二个功能也有时间复杂度O(n)。它会将数组转换为一组以消除重复,然后将其转换回数组。要将其转换为集合,它将首先以时间复杂度O(n)循环遍历数组的内容;每次迭代都会将一个项目插入到集合中。将项目插入ruby集合具有时间复杂度O(1)(使用哈希实现Set,并且哈希通常具有恒定时间插入)。要将最终集转换回数组,需要另一个循环。该循环再次具有时间复杂度O(n)。两个循环arr -> setset -> arr彼此独立,因此最终时间复杂度为O(n)。

我建议你阅读时间复杂度: http://en.wikipedia.org/wiki/Time_complexity