算法的大O复杂性

时间:2017-02-20 04:25:50

标签: ruby algorithm big-o code-complexity

此方法试图将num表示为arr。

中元素的乘积

例如,方法1(37,[1,3,5])返回[2,0,7]

// arr is an array of divisors sorted in asc order, e.g. [1,3,5] 
def method1(num, arr) 
  newArr = Array.new(arr.size, 0)
  count = arr.size - 1

  while num > 0
    div = arr[count]  

    if div <= num
      arr[count] = num/div
      num = num % div
    end 

    count = count - 1
  end 

  return newArr
end 

如果您可以帮助我获得算法的复杂性,我将非常感激。请随意提高算法的效率

2 个答案:

答案 0 :(得分:1)

以下是您的代码的重构版本:

def find_linear_combination(num, divisors)
  results = divisors.map do |divisor|
    q, num = num.divmod(divisor)
    q
  end
  results if num == 0
end

puts find_linear_combination(37, [5, 3, 1]) == [7, 0, 2]
puts find_linear_combination(37, [1, 3, 5]) == [37, 0, 0]
puts find_linear_combination(37, [5]).nil?

n的大小为divisors,此算法显然为O(n)。只有一个循环(map)并且循环内只有一个整数除法。

请注意,除数应按降序编写。如果未找到线性组合,则该方法返回nil。

如果要对divisors进行排序,算法将为O(n*log n)。如有必要(1)附加O(1)也是一个好主意。

答案 1 :(得分:0)

以下是您可以做的事情:

Server#start

输出:

def method1(num, arr)

    newArr = Array.new(arr.size, 0)
    count = arr.size()-1

    while num>0
        div = arr[count]

        if div <= num
            arr[count] = num / div
            num = num % div
        end

        count = count + 1
    end
    return arr
end


ar = Array.new(25000000) { rand(1...10000) }

t1 = Time.now
method1(37, ar)
t2 = Time.now

tdelta = t2 - t1

print tdelta.to_f

现在加倍数组大小:

0.102611062

输出:

ar = Array.new(50000000) { rand(1...10) }

再次加倍:

0.325793964

输出:

ar = Array.new(100000000) { rand(1...10) }

所以0.973402568 加倍,持续时间大致为三倍。由于O(3n)== O(n),所以 整个算法在O(n)时间运行,其中n表示输入的大小 阵列。

相关问题