如何解决地图与对象时间复杂度Node.js
考虑用 Node.js 编写的代码解决方案(参见 https://adventofcode.com/2020/day/15)
第一个 Snippet 使用 Map 来存储和访问数据。在我的本地机器上的 Visual Code 调试器中大约需要 19 秒,直到打印出解决方案。第二种算法是使用 Object 而不是 Map 并且根本不会结束。你可以看看。
这是什么原因,使用 Object 的第二个算法的运行时间相差如此之大,根本无法完成?他们使用完全相同的代码,一个使用 Map,另一个使用 Object。
这是地图示例:
//const input = "0,3,6" // the 30000000th number spoken is 175594.
const input = '0,13,16,17,1,10,6';
const spoken = input.split(",").map(char => parseInt(char,10));
const mem = new Map();
for (let n = 0; n < spoken.length; n++) {
const num = spoken[n];
if (!mem.has(num)) {
mem.set(num,[]);
}
mem.get(num).push(n);
}
for (let n = spoken.length; n < 30000000; n++) {
let last = spoken[n - 1],next;
if (mem.has(last) && mem.get(last).length > 1) {
const turns = mem.get(last);
next = turns[turns.length - 1] - turns[turns.length - 2];
} else {
next = -1;
}
if (next === -1) {
spoken.push(0);
if (!mem.has(0)) {
mem.set(0,[n]);
} else {
mem.get(0).push(n);
}
continue;
}
spoken.push(next);
if (!mem.has(next)) {
mem.set(next,[n]);
} else {
mem.get(next).push(n);
}
}
console.log(spoken[spoken.length - 1]) // 31916
现在,这里使用的是 Object 而不是 Map:
//const input = "0,10));
const mem = {};
for (let n = 0; n < spoken.length; n++) {
const num = spoken[n];
if (!mem[num]) {
mem[num] = [];
}
mem[num].push(n);
}
for (let n = spoken.length; n < 30000000; n++) {
let last = spoken[n - 1],next;
if (mem[last] && mem[last].length > 1) {
const turns = mem[last];
next = turns[turns.length - 1] - turns[turns.length - 2];
} else {
next = -1;
}
if (next === -1) {
spoken.push(0);
if (!mem[0]) {
mem[0] = [n];
} else {
mem[0].push(n);
}
continue;
}
spoken.push(next);
if (!mem[next]) {
mem[next] = [n];
} else {
mem[next].push(n);
}
}
console.log(spoken[spoken.length - 1]) // 31916
编辑:
即使将第 2 个版本减少到 3000000 次迭代(减少 10 倍),也需要更长的时间,实际上并没有等到它完成。
编辑 2021-01-23: 我已将两者添加到运行代码片段示例中。有趣的是,在代码片段中运行时,它没有如上所述的运行时问题。在本地 Visual Code 调试器中运行它们时会出现问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。