微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

地图与对象时间复杂度Node.js

如何解决地图与对象时间复杂度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 举报,一经查实,本站将立刻删除。