繁体   English   中英

如何用字典提高性能?

[英]How to increase performance with dictionary?

我的问题是,我在这段代码中没有最快的性能。 我喜欢用此代码解决的30个测试,但我只解决了28个,直到它抛出错误为止,因为这花了很长时间。

多数民众赞成在我的示例输入:

queryType: ["insert", "insert", "addToValue", "addToKey", "get"]
query: [[1,2], [2,3], [2], [1], [3]]
If queryType[i] === "insert" -> Add at query[i][0] value query[i][1].
If queryType[i] === "addToValue" -> Add query[i][0] to every value.
If queryType[i] === "addToKey" -> Add offset.
If queryType[i] === "get" -> Add query[i][0] to result value.

那就是我当前的代码:

function testHashMap(queryType, query) {
    let hash = {};
    let result = 0;
    let offset = 0;
    let len = queryType.length;
    for (let i = 0; i < len; ++i) {
        let querys = query[i][0];
        switch (queryType[i]) {
            case "insert": 
                hash[querys] = query[i][1];
                break;
            case "addToValue": 
                for (let key in hash) {
                    hash[key] += querys;
                }
                break;
            case "addToKey": 
                offset += querys;
                break;
            case "get": 
                result += hash[querys - offset];
                break;
        }
    }
    return result;
}

有人知道我如何提高此功能的速度吗? 感谢您的时间!

如果这是代码中的热点,则调度对象可能会更快(就像您所提的问题一样):

function testHashMap(queryType, query) {
    let hash = {};
    let result = 0;
    let offset = 0;
    let len = queryType.length;
    const dispatch = {
        insert(i) {
            hash[querys] = query[i][1];
        },
        addToValue() {
            for (let key in hash) {
                hash[key] += querys;
            }
        },
        addToKey() {
            offset += querys;
        },
        get() {
            result += hash[querys - offset];
        }
    };
    for (let i = 0; i < len; ++i) {
        let querys = query[i][0];
        (dispatch[queryType[i]] || () => {})(i);
    }
    return result;
}

这是因为对JavaScript引擎进行了调整,以主动优化热点中的对象方法/属性查找。

正如马特·蒂默曼斯(Matt Timmermans)在评论中指出的那样,提高速度的一种方法可能不是真正地增加每个值。 假设我们的起始值为

[1, 1, 1, 1]

现在为每个元素加3,我们记录一个一般的offset ,即3。

假设我们现在得到一个插入[2, 4] 我们想将第三个元素设置为4,因此我们首先减去偏移量。 4-3 = 1,所以我们实际上根本不更改第三个元素!

现在我们被要求在索引2处get元素。我们添加一般偏移量:

1 + 3 = 4

正如预期的那样。

这样,所有更新都保持在O(1)时间复杂度上,这应该运行得更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM