【发布时间】:2015-09-28 10:45:43
【问题描述】:
这个现象是我在编写 LeetCode 问题N-Queens时发现的。
我有两个版本的可接受代码,唯一的区别是我存储哈希表的方式,一个是使用vector<int>,另一个是使用vector<bool>。具体来说,两个版本的代码如下:
vector<int>,运行时间:4 毫秒
class Solution {
public:
void dfs(vector<string>& crtrst, vector<vector<string>>& finalrsts, int row, vector<int>& mup, vector<int>& m45dgr, vector<int>& m135dgr)
{
int n = crtrst.size();
if (row == n)
{
finalrsts.push_back(crtrst);
return;
}
for (int j=0; j<n; j++)
{
if (mup[j] && m45dgr[j-row+n-1] && m135dgr[row+j])
{
crtrst[row][j] = 'Q';
mup[j] = m45dgr[j-row+n-1] = m135dgr[row+j] = 0;
dfs(crtrst,finalrsts,row+1,mup,m45dgr,m135dgr);
crtrst[row][j] = '.';
mup[j] = m45dgr[j-row+n-1] = m135dgr[row+j] = 1;
}
}
}
vector<vector<string>> solveNQueens(int n)
{
vector<vector<string>> finalrsts;
vector<string> crtrst(n,string(n,'.'));
vector<int> mup(n,1);
vector<int> m45dgr(2*n-1,1); // degree 45: '\'
vector<int> m135dgr(2*n-1,1); // degree 135: '/';
int row = 0;
dfs(crtrst,finalrsts,row,mup,m45dgr,m135dgr);
return finalrsts;
}
};
版本 2,vector<bool>,运行时间:12 毫秒
class Solution {
public:
void dfs(vector<string>& crtrst, vector<vector<string>>& finalrsts, int row,
vector<bool>& mup, vector<bool>& m45dgr, vector<bool>& m135dgr)
{
int n = crtrst.size();
if (row == n)
{
finalrsts.push_back(crtrst);
return;
}
for (int j=0; j<n; j++)
{
if (mup[j] && m45dgr[j-row+n-1] && m135dgr[row+j])
{
crtrst[row][j] = 'Q';
mup[j] = m45dgr[j-row+n-1] = m135dgr[row+j] = false;
dfs(crtrst,finalrsts,row+1,mup,m45dgr,m135dgr);
crtrst[row][j] = '.';
mup[j] = m45dgr[j-row+n-1] = m135dgr[row+j] = true;
}
}
}
vector<vector<string>> solveNQueens(int n)
{
vector<vector<string>> finalrsts;
vector<string> crtrst(n,string(n,'.'));
vector<bool> mup(n,true);
vector<bool> m45dgr(2*n-1,true); // degree 45: '\'
vector<bool> m135dgr(2*n-1,true); // degree 135: '/';
int row = 0;
dfs(crtrst,finalrsts,row,mup,m45dgr,m135dgr);
return finalrsts;
}
};
据我所知,vector<bool> 使用 1 位而不是 bool 变量(可能是 2 字节)存储每个元素,vector<int> 使用 4 字节存储每个元素。所以vector<bool> 似乎比vector<int> 更小。但是,为什么比vector<int>慢呢?
【问题讨论】:
-
直观地说,从压缩存储中打包/解包需要 时间,所以我预计
std::vector<int>的表现优于std::vector<bool>,特别是因为 CPU 实际使用的是寄存器(int-sized 或更大)。 -
请问您使用的是哪种编译器?
-
这是一个很好的例子,说明程序员的直觉在预测性能行为时经常出错。
-
@DawidPi,我根据 LeetCode Online Judge 报了时间。所以我不知道它使用什么编译器。