我有一个问题,需要将列中的所有值重置为0或1.我使用的代码是通过简单的朴素方法来设置值每次迭代。有没有更快的实施。将C++中的行和/或列的所有值设置为1或0
//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或1.我使用的代码是通过简单的朴素方法来设置值每次迭代。有没有更快的实施。将C++中的行和/或列的所有值设置为1或0
//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
好,其他则迭代列有你可能要做出一些优化:
迭代列会降低效率,然后遍历行(约* 4较慢)由于cache表现。在列迭代中,每个元素都有一个缓存未命中 - 而在行迭代中,4个元素中的一个(通常取决于数据的体系结构和大小,但通常缓存行适合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)
中的数组的相同原理。
问题出自运行codechef长期竞赛....冰雹作弊..关闭该主题
解决问题的人也从某处读了一些书,一些教程.. OP不抄袭某人的代码。 –
显示一些代码? – billz
什么构成“专栏”? –
这是哪一个? 0还是1?你如何决定做什么? (0或1?) – amit