如何解决为什么用std :: vector保留空间运行速度较慢?
我创建了以下函数:给定一个m * n由1和0组成的矩阵,它返回多少个正方形的子矩阵都为1
例如
Input: matrix =
[
[0,1,1],[1,[0,1]
]
Output: 15
说明: 第1边有10个正方形。 侧面2有4个正方形。 侧面3有1个正方形。
有些程序没有保留空间。
int countSquares(vector<vector<int>>& matrix)
{
const size_t rows{ matrix.size() },cols{ matrix[0].size() }; //Get the number of rows and colums
//Creating a dynamic programing matrix
vector<vector<int>> dp(rows,vector<int>(cols)); //Initializing m * n elements (this should be slower than reserving without initializing)
dp[0][0] = matrix[0][0];
size_t count = dp[0][0]; //counter of the squares
for (size_t i{ 1 }; i < rows; ++i)
count += dp[i][0] = matrix[i][0]; //Count squares in the first row and update the dynamic programming first row
for (size_t i{ 1 }; i < cols; ++i)
count += dp[0][i] = matrix[0][i]; //Count squares in the first colums and update the dynamic programming first column
//Count the rest of squares and update the dynamic programming matrix
for (size_t i{ 1 }; i < rows; ++i)
for (size_t j{ 1 }; j < cols; ++j)
count += dp[i][j] = matrix[i][j] ? min({ dp[i - 1][j],dp[i - 1][j - 1],dp[i][j - 1] }) + 1 : 0;
return count;
}
这是完全相同的程序,但没有在构建时初始化动态编程矩阵并在使用前保留所有空间
int countSquares(vector<vector<int>>& matrix)
{
const size_t rows{ matrix.size() },cols{ matrix[0].size() }; //Get the number of rows and colums
//Creating a dynamic programing matrix
vector<vector<int>> dp; //This time without default initialization
dp.reserve(rows);
dp.push_back(vector<int>());
dp.back().reserve(cols);
dp.back().push_back(matrix[0][0]);
size_t count = dp[0][0];
//Count squares in the first row and update the dynamic programming first row
for (size_t i{ 1 }; i < rows; ++i)
{
dp.push_back(vector<int>());
dp.back().reserve(cols);
dp.back().push_back(matrix[i][0]);
count += dp.back().back();
}
//Count squares in the first colums and update the dynamic programming first column
for (size_t i{ 1 }; i < cols; ++i)
{
dp[0].push_back(matrix[0][i]);
count += dp[0].back();
}
//Count the rest of squares and update the dynamic programming matrix
for (size_t i{ 1 }; i < rows; ++i)
for (size_t j{ 1 }; j < cols; ++j)
{
dp[i].push_back(matrix[i][j] ? min({ dp[i - 1][j],dp[i][j - 1] }) + 1 : 0);
count += dp[i].back();
}
return count;
}
为什么第一个选项的运行速度快50%?
更新1:我在Visual Studio中使用std :: chrono :: system_clock :: now()为我的函数计时(创建一个很长的矩阵),并且还使用了以下页面: https://leetcode.com/problems/count-square-submatrices-with-all-ones/ 第一个选项的运行率是90%,第二个选项的运行率是40%
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。