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

标签 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

最佳答案

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

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

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

我建议您阅读有关时间复杂度的内容: http://en.wikipedia.org/wiki/Time_complexity

关于ruby - 计算Ruby Array#uniq自己实现的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20788545/

相关文章:

ruby - 如何在中间人的部分中渲染部分

ruby-on-rails - ruby 更新出错

Java:如何检查实例属于哪个对象?

c++ - 在C++登录程序中屏蔽密码

java - 如果我们不能使用 10^9*10^9 的二维数组,那我们为什么能够实例化它呢?

javascript - es6 Map 和 Set 复杂度,v8 实现

ruby-on-rails - 接收到 ActiveRecord 关系,但需要对象

ruby - Ruby Grape API 的数组查询参数

algorithm - 函数的平均情况复杂度

python - 以下解决方案的时间复杂度是 O(N) 吗?