Профилирование моего кода, связанного с процессором, подсказывает, что я долгое время проверяю, содержит ли контейнер полностью уникальные элементы. Предполагая, что у меня есть большой контейнер с несортированными элементами (с <
и =
), у меня есть две идеи о том, как это можно сделать:
Первое использование набора:
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, построенный для этой цели? Если нет, есть ли какие-либо предложения eek из более высокой эффективности?