[英]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.