You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

宝可梦属性三元克制循环查找暴力算法优化方案求助

优化方案

核心优化思路

  • 效率优化:把每个属性的克制列表从数组替换为Set结构,判断「C是否克制A」的操作时间复杂度从O(k)(k为单个属性的克制数量)降到O(1)。你的原有遍历逻辑本身就只遍历存在克制关系的节点,而非全量属性组合,宝可梦总共有18种属性,实际遍历次数仅百余次,完全不存在性能瓶颈。
  • 去重优化:新增已发现组合的缓存集合,每次找到三元克制链后,将三个属性按字典序排序生成唯一标识,只有该标识未被记录时才输出并缓存,避免同一组合从不同起点重复输出。

优化后代码

const fs = require("fs");

const reformat = (types) => {
  const map = new Map();
  types.forEach(e => {
    // 直接存克制关系的Set,方便快速查找
    map.set(e.name, new Set(e.strengths));
  });
  return map;
};

const search = (types) => {
  const visited = new Set();
  types.forEach((aStrengths, a) => {
    aStrengths.forEach(b => {
      const bStrengths = types.get(b);
      bStrengths.forEach(c => {
        const cStrengths = types.get(c);
        if (cStrengths.has(a)) {
          // 排序生成唯一key,相同组合不管顺序如何key都一致
          const uniqueKey = [a, b, c].sort().join('|');
          if (!visited.has(uniqueKey)) {
            visited.add(uniqueKey);
            console.log(`Found: ${a} => ${b} => ${c}`);
          }
        }
      });
    });
  });
};

// 执行逻辑
let types = JSON.parse(fs.readFileSync("types.json"));
types = reformat(types);
search(types);

效果说明

优化后不会再出现同一组合重复输出的问题,比如原输出里的Fire→Grass→Water、Water→Fire→Grass、Grass→Water→Fire只会保留一条,执行效率也有明显提升。

内容的提问来源于stack exchange,提问作者Dhison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:15:08