我遇到一个问题,需要将列中的所有值重置为0或1.我使用的代码是通过每次迭代设置值的正常天真方法。有没有更快的实施。
//Size of board n*n
i=0;
cin>>x>>y;x--;
if(query=="SetRow")
{
while(i!=N){ board[i][x]=y;i++;}
}
else
{
while(i!=N){ board[i][x]=y;i++;}
}
y可以是0或1
答案 0 :(得分:2)
那么,除了迭代列之外,您可能想要进行的优化很少:
由于cache性能,迭代列的效率低于行(约* 4慢)。在列迭代中,每个元素都有一个缓存未命中 - 在行迭代中,您有4个元素中的1个缓存未命中(通常,它取决于数据的体系结构和大小,但通常缓存行适合4个整数)。
因此 - 如果你经常迭代列然后行重新设计,以便更频繁地迭代行。 This thread讨论了类似的问题。
另外,在你这样做之后 - 你可以使用memset()
,我认为这是为这项任务更好地优化的。
(注意:编译器可能会在某些情况下自动为您执行此操作)
你可以使用延迟初始化,实际上有O(1)
算法初始化一个具有常量值的数组,这里有更详细的描述:initalize an array in constant time。这需要花费大约三倍的空间,以及后来更广泛的追求。
它背后的想法(2)是维护额外的堆栈(逻辑上,实现为数组+指向顶部的指针)和数组,附加数组将指示它何时首次初始化(从0到n的数字)并且堆栈将指出哪些元素已被修改。
当您访问array[i]
时,如果stack[additionalArray[i]] == i && additionalArray[i] < top
数组的值为array[i]
。否则 - 它是“初始化”值。
执行array[i] = x
时,如果尚未初始化(如前所述),则应设置additionalArray[i] = stack[top]
并增加top
。
这会导致O(1)
初始化,但正如所说它需要额外的内存,每次访问都更加广泛。
关于在O(1)
中初始化数组的文章所描述的相同原则也可以在这里应用。
答案 1 :(得分:0)
问题来自于运行codechef长期竞赛....冰雹骗子..关闭此帖子