この現象は、LeetCode問題N-Queensをプログラムしたときに検出されます。ベクトル<int>が次の場合にベクトル<bool>より速い理由
2つのバージョンのコードがありますが、唯一の違いは、私がハッシュテーブルを格納した方法です。一方はvector<int>
を使用し、もう一方はvector<bool>
を使用しています。次のように具体的には、コードの2つのバージョンがある:
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;
}
};
Iが知っているようvector<bool>
は、bool
変数(2バイトでもよい)ではなく1ビットを使用して各要素を格納し、vector<int>
は4バイトを使用して各要素を格納する。だからvector<bool>
はvector<int>
よりも小さく見えます。しかし、それはなぜvector<int>
よりも遅いのですか?
直観的には、圧縮記憶域からビットをパック/アンパックするのに時間がかかるので、 'std :: vector'が 'std :: vector 'よりも優れていると期待します。 withはレジスタ( 'int'-sizedまたはgreater)です。 –
Angew
どのような種類のコンパイラを使用しているのか分かりますか? – DawidPi
これは、パフォーマンスの振る舞いを予測する際に、プログラマの直感がしばしば間違っていることを示す良い例です。 –