let start=0;
let array=[];
function addLast(item) {
array[array.length] = item;
}
function removeFirst() {
if (start >= array.length) {
return undefined;
}
const result = array[start++];
if (start >= array.length - start) {
//move all the elements into the free space at beginning
let d=0;
for (let i=start; i<array.length; ++i) {
array[d++] = array[i];
}
start=0;
array.length = d;
}
return result;
}
addLast(1);
addLast(2);
addLast(3);
console.log(removeFirst());
addLast(4);
console.log(removeFirst());
console.log(removeFirst());
addLast(5);
console.log(removeFirst());
console.log(removeFirst());
1条答案
按热度按时间dphi5xsq1#
这实际上是一个实际问题,因为javascript没有一个有效的队列。通常,你只需要使用
push
加shift
除去,但是shift
需要o(n)个时间,因此当队列变长时,这是非常昂贵的。我使用的解决方案只需要一个额外的变量(
start
)并且降低了从o(n)到摊销o(1)的项目移除成本。项目仍将添加array.push(item)
,但既然你不能用,我就用array[array.length]=item
,它的作用完全相同。我不打算在课堂上总结这一点,因为在现实生活中,这很少合适:
程序非常简单。我们不是像shift那样每次移除一个元素都会移动所有的元素,而是等到移除了至少和我们必须移动的元素一样多的元素。这确保了,平均而言,每移除一个元素,最多会移动一个元素。