我有一個問題,需要將列中的所有值重置爲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