Профилирование моего кода, связанного с процессором, заставило меня потратить много времени на проверку того, содержит ли контейнер совершенно уникальные элементы. Предполагая, что у меня есть большой контейнер несортированных элементов (с определением <
и =
), у меня есть две идеи о том, как это можно сделать:
Первое использование набора:
template <class T>
bool is_unique(vector<T> X) {
set<T> Y(X.begin(), X.end());
return X.size() == Y.size();
}
Второй цикл по элементам:
template <class T>
bool is_unique2(vector<T> X) {
typename vector<T>::iterator i,j;
for(i=X.begin();i!=X.end();++i) {
for(j=i+1;j!=X.end();++j) {
if(*i == *j) return 0;
}
}
return 1;
}
Я протестировал их как можно лучше, и из того, что я могу почерпнуть из прочтения документации по STL, ответ (как обычно) зависит. Я думаю, что в первом случае, если все элементы уникальны, это очень быстро, но при большом вырождении операция, похоже, займет O (N ^ 2) времени. Для подхода с вложенными итераторами, похоже, верно обратное: он светится быстро, если X[0]==X[1]
, но занимает (понятно) O (N ^ 2) время, если все элементы уникальны.
Есть ли лучший способ сделать это, возможно, алгоритм STL, созданный для этой цели? Если нет, то есть ли какие-нибудь предложения по повышению эффективности?