arr = (1..10000).to_a.shuffle # 生成包含10000个整数的随机数组
# 方法一:先排序再取最大10个数
sorted_arr = arr.sort.reverse
result1 = sorted_arr[0, 10]
puts "方法一结果: #{result1}"
# 优化方法:使用堆排序思想(这里简单使用Ruby内置的堆相关方法)
require 'heap'
heap = Heap.new(arr)
heap.build_heap
result2 = []
10.times do
result2 << heap.extract_max
end
puts "优化方法结果: #{result2}"
性能优化说明
- 方法一:直接使用
sort
方法进行排序然后取最大10个数。sort
方法在Ruby中默认使用快速排序算法,其平均时间复杂度为O(n log n),空间复杂度为O(log n)。排序后取最大10个数的时间复杂度为O(10),总体时间复杂度为O(n log n)。
- 优化方法:利用堆排序思想。先构建最大堆,时间复杂度为O(n)。然后从堆中提取10次最大值,每次提取最大值的时间复杂度为O(log n),10次提取的时间复杂度为O(10 log n)。总体时间复杂度为O(n + 10 log n),相比于直接排序,在数据量较大时,优化后的方法在时间复杂度上更优,因为构建堆的操作在整体计算中占主导地位,减少了不必要的排序操作。 空间复杂度方面,优化方法在构建堆的过程中需要额外的空间来存储堆结构,空间复杂度为O(n)。