Hiện tượng này được tìm thấy khi tôi lập trình cho vấn đề LeetCode N-Queens.Tại sao vector <int> nhanh hơn vectơ <bool> trong trường hợp sau
Tôi có hai phiên bản mã được chấp nhận, khác biệt duy nhất giữa đó là cách tôi lưu trữ bảng băm, một là sử dụng vector<int>
và cách khác đang sử dụng vector<bool>
. Để cụ thể, hai phiên bản của mã như sau:
vector<int>
, Running Thời gian: 4 ms
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;
}
};
Phiên bản 2,
vector<bool>
, Thời lượng: 12 ms
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;
}
};
Như tôi biết rằng, vector<bool>
lưu trữ từng phần tử sử dụng 1 bit thay vì biến số bool
(có thể là 2 byte) và vector<int>
lưu trữ từng phần tử bằng cách sử dụng 4 byte. Vì vậy, vector<bool>
có vẻ tinier hơn vector<int>
. Tuy nhiên, tại sao nó chậm hơn vector<int>
?
Trực quan, phải mất * thời gian * để đóng gói/giải nén một chút từ bộ nhớ nén, vì vậy tôi sẽ * mong đợi * 'std :: vector' để hoạt động tốt hơn 'std :: vector ', đặc biệt là khi CPU thực sự hoạt động có đăng ký ('int'-sized hoặc lớn hơn). –
Angew
Tôi có thể biết bạn đang sử dụng loại trình biên dịch nào không? – DawidPi
Đây là một ví dụ tốt về cách trực giác của người lập trình thường xuyên sai khi nói đến việc dự đoán hành vi hoạt động. –