0
聲明具有初始大小和默認值的數組的運行時間是多少?Ruby中Array.new(n,x)的複雜性是什麼?
聲明具有初始大小和默認值的數組的運行時間是多少?Ruby中Array.new(n,x)的複雜性是什麼?
關於小數組和線性之後的常量。
require 'benchmark'
0.upto(9).each do |power|
elements = 10 ** power
time = 10.times.map { Benchmark.measure { Array.new(elements, :foo) } }.sum(&:real)/10
p [elements, '%f' % time]
end
# [1, "0.000001"]
# [10, "0.000001"]
# [100, "0.000002"]
# [1000, "0.000011"]
# [10000, "0.000038"]
# [100000, "0.000286"]
# [1000000, "0.004231"]
# [10000000, "0.036348"]
# [100000000, "0.404822"]
# [1000000000, "8.454289"]
作爲一個直觀的解釋:
它基本上分配一個連續存儲器塊(*)和在存儲器每一個別塊(一個寫入對象的表示(指針)塊是一個數組元素)。對每個塊進行迭代都會導致線性複雜性。
請注意,對於小內存塊可能會有一些優化,使其保持不變。
(*)對於較大的塊,塊可能不連續,這會導致更差的性能。
所有這些比Ruby的實現本身更可能更依賴硬件/操作系統。
你想知道數組初始化需要多少時間嗎?而'n'增加了什麼是初始化複雜度/ O(n)? – AnkitG
如果不是'O(n)',我會感到非常驚訝。你對這個@LucasAlencar有懷疑嗎?爲什麼? – spickermann
@spickermann:儘管如此,Ruby語言規範沒有*保證它。實際上,ISO語言規範,RubySpec,RDocs,Ruby編程和Ruby編程語言都不能指定*任何類型的性能。這意味着Ruby實現完全有可能通過O(n2)算法實現它,並且完全符合Ruby。這樣的實現可能不會被Ruby社區接受,但是*沒有保證*。 –