您的位置:首页 > 编程语言 > Ruby

会场安排问题(贪心算法,Ruby)

2017-09-12 21:50 281 查看
感觉每一个算法都能要我老命,一个贪心算法又是花了老长时间,浮躁要命啊

方案:每次从剩下未安排的会议中选择具有最早结束时间且不会与已安排的的会议重叠的会议来安排。

先贴代码,也可查看我的GitHub

#_*_ coding:utf-8 _*_

@begin = [1,3,0,5,3,5,6,8,8,2,12]
#结束时间要按升序排列
@end = [4,5,6,7,8,9,10,11,12,13,14]
@ary = Array.new(11,false)
#@result = []

def greedySelector(beginAry,endAry,ary)
ary[0] = true
j,i = 0,1
while i < beginAry.size
if beginAry[i] >= endAry[j]
ary[i] = true
j = i
else
ary[i] = false
end
i += 1
end
end

#def greedySelector2(beginAry,endAry)
##选出最早结束的回忆,如果有两个同时结束,那可能就很尴尬了
#i = endAry.index(endAry.min)
#@result << i  #将第一个会议输出
#j = 0
#while j < beginAry.size
#if j == i
#j += 1
#next
#end
#if endAry[i] <= beginAry[j]
#@result << j  #输出符合条件的会议
#i = j
#end
#j += 1
#end
#end

#puts "使用自己理解的方法,结果如下:"
#greedySelector2(@begin,@end)
#puts @result.join(' ')

puts "参照课本改写的方法,结果如下:"
greedySelector(@begin,@end,@ary)

@ary.each_with_index do |item,index|
if item
print "#{index} "
end
end
puts ""


各位看官,我自己写的等于是全部注释掉了,留着时常警示自己。

我的算法中第一步是找出结束时间中最小的那个会议,然而这并不需要,我是参考的课本,课本上对这个算法的分析有一句写的很清楚,数组是按结束时间升序排列的,所以第1个必然是第一个要开始的会议(不理解的自己想吧,我感觉解释不清,这是选这个方案的必然结果)。所以我走了弯路,我本来的想法是从混乱无序的数组中选出正确的顺序,然而并没有必要。

后来我也想过怎样设计适合无序数组的算法,其实很简单,先排序,然后就想不出了,感觉自己的思路被限制了。

今晚写的有点混乱,大家参考一下代码就好了,写这篇博客只是希望我以后分析问题的时候少些浮躁,仔细一点,不然真的会浪费很多时间,与诸君共勉!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ruby 算法