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

求快速生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:55:31