宝可梦属性三元克制循环查找暴力算法优化方案求助
优化方案
核心优化思路
- 效率优化:把每个属性的克制列表从数组替换为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
相关产品推荐
相关产品推荐

