我看到了this。
我用不同的论点做到了这一点:
def uniq(arr)
out = {}
arr.each do |el|
out[el] = nil
end
out.keys
end
此代码的连接复杂性是什么?如何改进?
怎么样:
def uniq(arr)
arr | []
end
答案 0 :(得分:2)
函数的时间复杂度为O(n),因为它需要做的工作与数组的大小成线性比例。
你有两个循环arr.each
和out.keys
。每个的复杂度是O(n),因为每个循环体的复杂度是O(1)(即,需要在循环体内完成的工作与数组大小无关)。由于两个循环彼此独立,因此总复杂度为O(n)。
你的第二个功能也有时间复杂度O(n)。它会将数组转换为一组以消除重复,然后将其转换回数组。要将其转换为集合,它将首先以时间复杂度O(n)循环遍历数组的内容;每次迭代都会将一个项目插入到集合中。将项目插入ruby集合具有时间复杂度O(1)(使用哈希实现Set,并且哈希通常具有恒定时间插入)。要将最终集转换回数组,需要另一个循环。该循环再次具有时间复杂度O(n)。两个循环arr -> set
和set -> arr
彼此独立,因此最终时间复杂度为O(n)。
我建议你阅读时间复杂度: http://en.wikipedia.org/wiki/Time_complexity