求快速生成n项Ulam序列的算法优化提示
Ulam序列算法优化提示
我在解决Codewars的kata任务时,实现了一个生成Ulam序列的算法,但速度太慢无法通过测试——生成2450项耗时近1.6秒。我不需要完整解决方案,仅需优化提示以提升算法速度。
原实现代码:
function ulamSequence(u0, u1, n) { // create an array with first two elements in it const seq = [u0, u1]; // create a loop that checks if next number is valid and if it is, push it in seq num: for (let i = u1 + 1; seq.length < n; i++) { let sumCount = 0; for (let k = 0; k < seq.length - 1; k++) { if (seq.indexOf(i - seq[k]) > k && ++sumCount === 2) { continue num; } } sumCount === 1 ? seq.push(i) : ""; } return seq; }
优化提示:
- 用哈希集合加速存在性查询:原代码里
seq.indexOf()是O(n)的线性查询,每次检查都要遍历整个序列。可以额外维护一个Set存储已生成的Ulam数,这样查询i - seq[k]是否存在的时间复杂度降到O(1),大幅减少查询耗时。 - 提前终止无效的内层循环:当
seq[k] > i/2时,i - seq[k]会小于seq[k],而我们已经遍历过所有比seq[k]小的元素,这时候可以直接跳出内层循环,避免重复检查。 - 预维护和的计数表:新增一个Ulam数时,遍历已有的所有更小的Ulam数,将两者之和的计数在Map/对象中加1。后续判断某个数是否符合Ulam数条件时,直接查这个计数是否为1即可,不用每次都重新计算所有可能的组合。
- 简化冗余代码:把
sumCount === 1 ? seq.push(i) : "";改成if (sumCount === 1) seq.push(i);,去掉无意义的空字符串操作,减少不必要的运算。
内容的提问来源于stack exchange,提问作者user20833060
相关产品推荐
相关产品推荐

