美文网首页
从一个权重算法上看如何利用javascript的与逻辑实现短路机

从一个权重算法上看如何利用javascript的与逻辑实现短路机

作者: dma_master | 来源:发表于2016-08-06 13:58 被阅读50次

    先从一个老掉牙的例子开始吧

    1,一个数据在[k1,+∞)的部分获得一个m1的权重
    2,当数据在[k2,k1)的时候获得一个m2的权重
    ...
    n,当数据在[0,kn]的时候获得一个mn的权重

    最简单的方法就是使用if()else()语句来对输入的数据进行区分。类似于这样

    function xx(xx){
        var result = '';
        while(xx != 0){
            if (xx >= k1) {
                result += (xx - k1)*m1;
                xx -= k1;
            }
            else if(xx >= k2){
                result += (xx - k2)*m2;
                xx -= k2;
            }
            else if(xx >= k3){
                result += (xx - k3)*m3;
                xx -= k3;
            }
            else{
                result += (xx - kn)*mn;
                xx -= kn;
            }
        }
        return result;
    }
    

    这样的写法简单但是低效。如果引入了javascript中的短路机制来解决这个问题的话就会变得非常简单
    所谓的短路机制就是下面两种情况

    • false && (anything) 短路计算的结果为false.
    • true || (anything) 短路计算的结果为 true.

    利用上面的特性我们可以构建一个遍历输入变量xx所有因子的循环,在当遍历到非kn的数据时,利用短路机制屏蔽掉,当便利到kn的时候我们对数据进行加权并计算返回结果。

    var hash = [];
        hash[kn] = mn;
        hash[k3] = m3;
        hash[k2] = m2;
        hash[k1] = m1;
    
    function xx(xx){
        for (var i = xx, result = 0; i >= 0 ; i--) {
            hash[i]&&(
                result += (xx - i)*hash[i],
                xx = i;
                )
        }
        return result;
    }
    

    这样做就可以利用了短路特性而精简整个代码的执行效率了。
    至于,在用for循环的时候为什么要用i--来倒序遍历而不是使用i++这样正序遍历,以及怎么写循环来获得一个高效的执行效率,那就下次再说了。

    相关文章

      网友评论

          本文标题:从一个权重算法上看如何利用javascript的与逻辑实现短路机

          本文链接:https://www.haomeiwen.com/subject/zsvljttx.html