【备忘】一个简单的算法题目:一个二维数组中有多个一维数组,这个一维数组的数据结构一致,但键名可能不一样,要求计算出不重复键名的num值,最后得出不重复键名组成的二维数组。

27 篇文章 0 订阅
2 篇文章 0 订阅

(为了方便阅读,这是简化过后的题例)

题例:

$gameStatistics = [
    ["game"=>'aaa',"gameid"=>'100',"num"=>3],
    ["game"=>'bbb',"gameid"=>'222',"num"=>92],
    ["game"=>'ccc',"gameid"=>'333',"num"=>3],


    ["game"=>'aaa',"gameid"=>'100',"num"=>3],
    ["game"=>'bbb',"gameid"=>'222',"num"=>15],
    ["game"=>'ccc',"gameid"=>'333',"num"=>33],

    ["game"=>'aaa',"gameid"=>'100',"num"=>33],
    ["game"=>'bbb',"gameid"=>'222',"num"=>133],
    ["game"=>'ccc',"gameid"=>'333',"num"=>38],
    ["game"=>'fff',"gameid"=>'444',"num"=>77],

    ["game"=>'aaa',"gameid"=>'100',"num"=>37],
    ["game"=>'bbb',"gameid"=>'222',"num"=>193],
    ["game"=>'ccc',"gameid"=>'333',"num"=>31],

    //省略更多......
];

最后的结果应该为:

$result = [
    ["game"=>'aaa',"gameid"=>'100',"num"=>???],
    ["game"=>'bbb',"gameid"=>'222',"num"=>???],
    ["game"=>'ccc',"gameid"=>'333',"num"=>???],
    ["game"=>'fff',"gameid"=>'444',"num"=>???],
];

请用代码算出???的结果。

计算过程:


    //$statistics是个二维数组,$statistic是$statistics的一维数组,$statistic参考值如下:
    //array(3) {
    //  ["game"] => string(12) "斗地主"
    //  ["gameid"] => string(3) "520"
    //  ["num"] => int(3)
    //}

    //将不重复数据保存到变量
    $tmp_name_arr1 = [];
    foreach ($statistics as $statistic){
        if(empty($tmp_name_arr1[$statistic['gameid']])){
            $tmp_data = [
                'gameid'=>$statistic['gameid'],
                'num'=>$statistic['num'],
                'game'=>$statistic['game'],
            ];
            $tmp_name_arr1[$statistic['gameid']] = $tmp_data;
        }
        //改进后的代码(之前的写法有问题,会多加一次)
        else{
            $tmp_name_arr1[$statistic['gameid']]["num"] += $statistic['num'];
        }
    }

    //$tmp_name_arr1
    //array(3) {
    //  [100] => array(3) {
    //    ["gameid"] => string(3) "100"
    //    ["num"] => int(1)
    //    ["game"] => string(12) "血战到底"
    //  }
    //  [520] => array(3) {
    //    ["gameid"] => string(3) "520"
    //    ["num"] => int(1)
    //    ["game"] => string(12) "四川麻将"
    //  }
    //  [411] => array(3) {
    //    ["gameid"] => string(3) "411"
    //    ["num"] => int(2)
    //    ["game"] => string(15) "跑得快"
    //  }
    //}
    
    //再计算num值
    //foreach ($tmp_name_arr1 as $key_id=>&$arr1){
    //    foreach ($gameStatistics as $stat1){
    //       if($stat1['gameid'] == $key_id){
    //            $arr1['num'] += $stat1['num'];
    //        }
    //    }
    //}

    //unset($arr1);//删除引用

    var_dump($tmp_name_arr1);

有兴趣的朋友可以试试其它算法。

以上由自己思考得出方法,还有改进空间,还有工作要做,后续再改进......

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来解答你的问题。 首先,矩阵连乘的最优运算顺序问题是一个经典的动态规划问题。我们可以使用动态规划法、分治法和备忘录法来解决这个问题。 1. 动态规划法 我们可以使用一个二维数组 m 来保存子问题的最优解,m[i][j] 表示从第 i 个矩阵到第 j 个矩阵连乘的最小代价。我们可以按照矩阵链长度递增的顺序计算 m[i][j],最终得到 m[1][n] 就是整个问题的最优解。 动态规划法的时间复杂度为 O(n^3),其中 n 是矩阵的个数。 2. 分治法 我们可以将问题分解成两个子问题,分别求解左子链和右子链的最优运算顺序,然后将它们合并起来计算总代价。具体地,我们可以枚举断点 k,将原问题分解成 A[i...k] 和 A[k+1...j] 两个子链,分别求解它们的最优运算顺序,然后将它们合并起来计算总代价。最终得到的就是整个问题的最优解。 分治法的时间复杂度为 O(n^3),其中 n 是矩阵的个数。 3. 备忘录法 备忘录法是一种优化动态规划法的方法,它可以避免重复计算子问题的最优解。具体地,我们可以使用一个二维数组 memo 来保存已经计算过的子问题的最优解,如果某个子问题已经计算过了,我们就直接从 memo 数组中取它的最优解,否则我们就按照动态规划的方式计算它的最优解。 备忘录法的时间复杂度为 O(n^3),其中 n 是矩阵的个数。 在初始化一个10000个矩阵的连乘问题时,由于矩阵个数太多,这三种方法的运行时间都会比较长。一般来说,动态规划法和备忘录法的运行时间比分治法快一些。具体的运行时间需要根据具体实现情况来决定,可以使用计时工具来测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SDL大华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值