处理加权排序类型问题的一般套路
适用问题类型:
需要对n个元素(带有一定权重,比如花费,截止日期,持续时间等)进行排序以获得所要求的最优解
例如,你是一个小印刷社的老板,只有一台打印机。你每天都需要面对如下问题:每天早上客户们都会来找你下订单,你需要把这些订单排序依次去完成,而且要尽量让所有顾客满意。如何决定先完成谁的订单,后完成谁的订单呢?
这类问题就可以用到下面的套路了!
套路:
1. 首先考虑只存在两个元素的情况,比如A和B。那么我们可知,只有两种可能的排序情况,要么先A后B,要么先B后A。
2. 对于每种情况,写出其加权的数学表达式。
举例:
还是上面例子中的背景,假设顾客i的订单需要花费ti时间去完成。给出一个时间表(其实就是完成订单的顺序),假设Ci表示i订单完成的时间,比如订单j是你今天第一个要完成的,Cj = tj,如果订单j是在i完成后所完成的,那么Cj = Ci + tj。同时每个顾客i都有一个权重(weight)wi,代表他们对你的小店的重要性。顾客i的满意程度取决于他订单的完成时间。因此,你希望排出一个时间表使得加权的完成时间尽量小,
设计一个算法可以给出最小化的sum(假设有n个订单,完成i订单所需时间ti,以及顾客i的权重wi都已给出)
解:
我们就可以套用上面的方法,先假设你的印刷店只有两个订单a和b,那么时间表无非就是先a后b或先b后a
当先a后b时,由上面的sum式子可以得出 Sab = wa·ta + wb(ta+tb) < wb·tb + wa(tb+ta) = Sba
消掉共有项,可以得出: wb·ta < wa·tb ,
然后把带有a的项移到左边,带有b的项移到右边 ⇒ ta/wa < tb/wb
也就是说,上面这道例题,我们的算法是,把所有顾客的订单按照ti/wi的顺序从小到大排列,然后依次完成即可。
对该算法进行证明:
反证法:假设存在相邻2个元素没有按顺序放置(位置互换),我们证明,当互换这两个元素后,其结果比原来更好。重复此步骤,最终我们会得到一个排好序的序列,实际上其本质就是冒泡排序,其证明了排序好的序列别其他任何序列更高效(或者说,不比其他任何一种序列差)。因此,此算法是最佳方案。 阅读更多- ASP.NET一般处理程序(.ashx.cs)中使用Session的问题
- 关于上次说的强类型dataset中事务问题的解决办法,也实用于一般的事务解决方案
- 基于Converter解决Struts无法处理日期类型的问题
- 关于SQL查询的字符串类型字段的排序问题
- SpringMVC日期类型转换问题三大处理方法归纳
- 关于ajax调用一般处理文件,传值内容过多后无法进入一般处理文件的问题
- 问题处理-JPA使用CASE...WHEN...语句实现数据排序问题
- RIA Service中对于递归实体类型处理的问题及解决方案
- java.lang.NoSuchMethodError问题处理(同一类型的jar包有不同版本存在)
- ssm 中针对Date类型的数据展示在页面上的处理问题
- 将int字段改为decimal类型时出现1264 Out of range value的问题分析和处理
- DB2 故障处理的思路及一般问题的解决办法
- ASP.NET一般处理程序访问Session问题
- 一点点小问题,关于用传址返回值类型API的返回值处理问题
- 处理dotProject中的按“分配的用户”排序问题
- .net跨域访问一般处理文件传过来的Json问题
- 关于MYSQL数据库Timestamp类型为空抛异常问题的处理
- 关于Arcgis数据类型变换问题及处理
- 触发器(当2个表中的相应值改变时同时改变一个表中的一个字段)(同时有处理“无法解决 equal to 操作的排序规则冲突”问题)
- Javascript escape 解决 Jquery Ajax 异步请求 URL中文传参乱码问题 一般处理程序Handler获取参数