路径求解问题, 寻找算法大神指点 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hourui
V2EX    程序员

路径求解问题, 寻找算法大神指点

  •  
  •   hourui
    cuber 2014 年 5 月 15 日 3346 次点击
    这是一个创建于 4293 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天做项目遇到了一个棘手的问题, 整理归纳以后大致总结为是一个路径求解问题
    问题如下, 以及经过无数脑细胞过度死亡后, 粗略的尾递归解法一并给出

    由于项目是c++的(转换为php仅是为了方便大家阅读)
    此法会导致大量的内存分配和释放, 效率并不是很高!
    想问下v2上的算法大神, 有无更高效的解决方案?
    第 1 条附言    2014 年 5 月 15 日
    昨天和基友@napoleonu 思索到深夜...
    找到了一种「矩阵法」求解方式, 简单理解为把结果想象为一个矩阵, 然后做填空题
    代码实现如下:

    欢迎各路大神交流
    9 条回复    2014-05-16 00:35:51 +08:00
    akfish
        1
    akfish  
       2014 年 5 月 15 日
    未细看,如果瓶颈仅仅在于内存的分配和释放的话,尝试一次性分配足够空间,反复重用。
    txx
        2
    txx  
       2014 年 5 月 15 日
    模是多大?
    davidli
        3
    davidli  
       2014 年 5 月 15 日
    既然是因为a的数量太多导致内存占用, 为什么不把a分割一下再分别处理呢
    iloahz
        4
    iloahz  
       2014 年 5 月 15 日
    大概看了一遍,复杂度和空间都是理论下限了。到了常数阶段的话,可以试试:

    1. 少用stl
    2. 不要玩字符串,hash它
    PS3. 个人觉得递归版很合理了,唯一是不要把数组当int玩啊。。
    exch4nge
        5
    exch4nge  
       2014 年 5 月 15 日
    字符串上的消耗比较大吧,基本同意 @iloahz 的。
    话说为什么用递归(尾递归)?不是直接可以嵌套循环么?
    尾递归如果编译器没优化的话,不是因为push/pop stack的原因效率会更慢么?
    hourui
        6
    hourui  
    OP
       2014 年 5 月 15 日
    @akfish 数据宽度和深度都是未知, 所以无法预估空间消耗...
    @txx 这是跑在一个在线engine上的, 对于性能要求很高, 由于每次轮询都需重新构建vector, 数据膨胀造成的性能下降不是线性的... 所以我觉得这不是最优解...
    @iloahz 为了方便理解, 直接写成string了, 实际项目中已经做过一次onway hash, string的频繁构建析构是不存在的
    @exch4nge 你可以看下c++的版本, 是一个循环解法, 是php版本尾递归的非递归实现
    napoleonu
        7
    napoleonu  
       2014 年 5 月 15 日
    酷。
    fengxx
        8
    fengxx  
       2014 年 5 月 15 日
    这个可以看成是一个 Mixed radix numbers, 我们常用的是10进制数,比如3位以内的数字排列是0-999。如果是mixed radix 的话,可以看成第1位最大为X, 第2位最大为Y, 第3位为 Z, 那么所有的排列是
    0 到 ZYX, 例如:
    000
    001
    002
    ....
    00X
    010 (这里产生了进位)
    011
    ...
    01X
    020(这里产生了进位)
    .....
    ....



    所有的排列之和为 X*Y*Z

    java code

    /**
    *
    * @author Ted
    */
    public class MixedRadix {

    public void permutation(String[][] elements) {
    int[] mixedRadix = new int[elements.length + 1];
    int[] number = new int[elements.length + 1];
    //init
    for (int i = 0; i < elements.length; i++) {
    mixedRadix[i] = elements[i].length - 1;
    }
    //sentinel
    number[elements.length] = 1;
    int bits = 0;
    while (bits < elements.length) {
    printChoice(elements, number);
    int j = 0;
    while (number[j] == mixedRadix[j]) {
    number[j] = 0;
    j++;
    }
    number[j] = number[j] + 1;
    bits = j;
    }

    }

    private void printChoice(String[][] elements, int[] choice) {
    for (int i = 0; i < choice.length - 1; i++) {
    System.out.print(elements[i][choice[i]] + " ");
    }
    System.out.println("");
    }

    public static void main(String... args) {
    String[][] elements = {
    {"a1", "a2"}, {"b1", "b2", "b3", "b4"}, {"c1", "c2"}
    };
    MixedRadix mr = new MixedRadix();
    mr.permutation(elements);
    }
    }


    如果对这类问题感兴趣,可以参考 free book <Matters Computational>
    http://www.jjj.de/fxt/fxtpage.html#fxtbook
    hourui
        9
    hourui  
    OP
       2014 年 5 月 16 日
    @fengxx 「Mixed radix numbers」这个思路赞. 谢谢指点
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     744 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 20:11 PVG 04:11 LAX 12:11 JFK 15:11
    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