提问人: 提问时间:1/20/2023 更新时间:1/20/2023 访问量:70
可以创建n个元素的ulam序列的快速算法
Fast Algorithm That Can Create Ulam Sequence of n Elements
问:
我一直在尝试解决代码战上的这个套路。 我有一个算法,但它显然太慢了,无法通过测试。它可以在不到 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;
}
答:
0赞
kvz
1/20/2023
#1
function ulamSequence(u0, u1, n) {
const seq = [u0, u1];
const set = new Set(seq);
for (let i = u1 + 2; seq.length < n; i++) {
let sumCount = 0;
for (let k = 0; k < seq.length - 1; k++) {
if (set.has(i - seq[k])) {
sumCount++;
if (sumCount === 2) {
continue;
}
}
}
if (sumCount === 1) {
seq.push(i);
set.add(i);
}
}
return seq;
}
评论
3赞
adiga
1/20/2023
虽然此代码可以回答该问题,但提供有关此代码为什么和/或如何回答该问题的其他上下文可以提高其长期价值。
1赞
gog
1/20/2023
#2
这里有一个想法:有一个数组,以便保持 的可能求和数。例如,对于 U(1,2) 将是 1 和 2 (1+4, 2+3)。在每个步骤中,找到最小值,以便 和 .添加到结果中,然后将其与所有先前的项目相加并相应地更新。sums
sums[N]
N
sums[3]
sums[5]
N
N > last item
sums[N] == 1
N
sums
function ulam(u0, u1, len) {
let seq = [u0, u1]
let sums = []
let last = u1
sums[u0 + u1] = 1
while (seq.length < len) {
last += 1
while (sums[last] !== 1) {
last += 1
}
for (let n of seq) {
let s = n + last
sums[s] = (sums[s] || 0) + 1
}
seq.push(last)
}
return seq
}
console.time()
ulam(1, 2, 2450)
console.timeEnd()
评论