类的优化程度是否足以接受堆栈中的100万项?
class Stack
attr_accessor :stacks
def initialize()
@stacks = []
end
def max ()
#first we could Think by
#sort the stack
#then take the last element
#but I think it is not efficent
if @stacks.size == 0
return puts"Error no input"
elsif @stacks.size == 1
@stacks.first
else
return @stacks.max
end
end
def push(value)
@stacks.push(value)
end
def pop()
if @stacks.size == 0
return puts"Error no input"
else
@stacks.pop
end
return @stacks
end
end
class Extras < Stack
def average()
if @stacks.size == 0
return puts"Error no input"
elsif @stacks.size == 1
return @stacks.first
else
#used inject instead of loop to get more familiar with ruby
sum = @stacks.inject(0, :+)
lenght = @stacks.size
averages = sum / lenght
return averages
end
end
end
users = Extras.new
puts users.push(1)
puts users.push(5)
puts users.push(3)
users.pop
puts users.push(10)
puts users.average发布于 2016-12-20 17:42:04
这里的代码实际上只是包装了ruby库中的Array类。因此,您的性能将与使用Array本身完全相同。数组可以在RAM中保存尽可能多的项,并且性能将取决于您正在运行的任何机器。
ruby数组类是用C编写的,性能相当好。你问优化,但你没有给出任何标准,所以我不能真正推测超过这一点。如果您需要的东西非常快,或需要跨越数百万或数十亿项,您可能需要查看另一种语言,甚至数据库。
查看您的代码,您有几个模式if-elsif-else的实例。后两者是多余的,可以合并。例如,包含一个项的数组的最大值将是一个项,您不必将其分解。同样地,对于做平均,你可以用一个项目来平均一个列表,你仍然会得到正确的答案。
def max ()
# returning 'puts' is _very_ unusual. It would be better to return nil, which Array#max would do anyway
return puts "Error no input" if @stacks.empty?
@stacks.max # the last expression is returned automatically
end
def average()
return puts"Error no input" if @stacks.empty?
sum = @stacks.inject(0, :+)
sum / @stacks.size # note that if you sum an array of integers this way, the final average will also be an integer unless you convert something to a float first
end发布于 2017-04-01 19:03:44
Ruby2.4包括数组的求和方法。
my_arr = [1,2,3,4,5].sum
#=> 15
['foo', 'bar'].sum # concatenation of strings
#=> "foobar" http://ruby-doc.org/core-2.4.0/Array.html
您不再需要减少或注入来获得数组的和!
https://codereview.stackexchange.com/questions/150398
复制相似问题