实际应用中遇到的算法问题,请教各位大牛。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaochong
V2EX    问与答

实际应用中遇到的算法问题,请教各位大牛。

  •  
  •   xiaochong 2015-04-07 17:21:32 +08:00 3006 次点击
    这是一个创建于 3906 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:

    假设有1000个订单,每个订单的金额不同且相差较大,要分成10组来处理这些订单,希望每组的单数和每组订单的总额尽量相等,请问如何分配。希望各位给出算法设计和复杂度计算。

    抛砖:

    目前我的想法:先对1000个订单的金额进行排序,然后将拍好序的订单按照蛇形方式分配到10组内,即第1~10个订单分别分配到第1~10个组内,当11~20分别分配到第10~1个组内,如此重复。这样的时间复杂度是排序的复杂度O(n log_n)。
    第 1 条附言    2015-04-08 09:56:25 +08:00
    谢谢各位的回答,可能由于我的问题对于最优解的定义不是很清楚,该问题中每组的单数不一定是固定的,虽然固定后会简化问题,但得到的应该不是最优解。

    重新定义下最优解,问题希望每组的单数和每组订单的总额尽量相等,可以将这个模糊的需求翻译成数学语言,最优解使每组订单数的方差加上每组订单总额的方差二者的和最小。

    希望各位继续发言,谢!
    13 条回复    2015-04-08 06:13:02 +08:00
    wy315700
        1
    wy315700  
       2015-04-07 17:53:03 +08:00
    每次把排好序的订单里 取出最小的,放到10个组里面和最小的那个里
    wy315700
        2
    wy315700  
       2015-04-07 17:53:56 +08:00
    或者压根不需要对1000个订单进行排序,每次取出一个 放到10个组里面和最小的那个里

    复杂度 1000 log(10)
    dingyaguang117
        3
    dingyaguang117  
       2015-04-07 17:58:41 +08:00
    我觉得LZ意思应该是在单数相等的情况下,总额尽量相等吧。不然连最优解的定义都不明确了
    dingyaguang117
        4
    dingyaguang117  
       2015-04-07 18:00:20 +08:00
    如果要求总额尽量相等, 单数这个应该可以忽略吧?

    A: 1000*1
    B: 20 *50
    dingyaguang117
        5
    dingyaguang117  
       2015-04-07 18:00:57 +08:00
    另外我真的很好奇LZ这个需求是什么情况下产生的,相当难想象
    9hills
        6
    9hills  
       2015-04-07 18:03:01 +08:00
    如果只是这个场景,你用NlogN绝对是足够了。没必要优化
    dingyaguang117
        7
    dingyaguang117  
       2015-04-07 18:03:28 +08:00
    @wy315700 不排序真的误差很大,我觉得应该排序完之后,按照从大到小的次序取出,放到当时最小的那个桶里, 因为是从大到小取出的,最后的偶然因素引起的突变会越来越小
    justfly
        8
    justfly  
       2015-04-07 18:21:49 +08:00
    排序 把排好顺序的订单先依次从1到10放进10个桶中 然后再从10到1 如此往复
    lvfujun
        9
    lvfujun  
       2015-04-07 18:23:52 +08:00
    @justfly 牛逼!
    binux
        10
    binux  
       2015-04-07 18:26:19 +08:00
    看你的描述,根本不是最优解啊,你是不需要最优解吗?
    zipher
        11
    zipher  
       2015-04-07 19:26:32 +08:00
    这方法不正确啊,999个100 和1个10000 按照你的方法应该不是你的预期把
    另外 你这个描述很模糊“每组的单数和每组订单的总额尽量相等”
    h4x3rotab
        12
    h4x3rotab  
       2015-04-07 19:54:15 +08:00
    虽然没仔细想,但是目测最优解是一个NPC问题,我觉得模拟退火用在这个问题上不错
    darrenxyli
        13
    darrenxyli  
       2015-04-08 06:13:02 +08:00
    DP。m[i, j] = max{m[i-1, j], m[i-1, j-ai]}, j = total/10. 分10次DP,每次i=10就跳出,选中的剔除。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5168 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 05:59 PVG 13:59 LAX 21:59 JFK 00:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86