벡터 중복 제거 및 정렬 최적화
중복을 지우고 큰 벡터를 정렬하는 것은 프로그래밍에서 중요한 작업일 수 있습니다. 다양한 접근 방식을 살펴보고 이 프로세스에서 효율성을 달성하는 방법을 살펴보겠습니다.
1. 정렬 및 고유 결합:
제공된 코드 조각은 std::erase 및 std::sort를 사용하여 중복 항목을 지우고 벡터를 정렬하려고 시도합니다. 그러나 std::unique에는 정렬된 입력 반복자가 필요하기 때문에 작동하지 않습니다.
이 문제를 해결하려면 먼저 벡터를 정렬한 다음 std::unique를 적용하여 중복 항목을 제거할 수 있습니다.
std::sort(vec.begin(), vec.end()); vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
2. 중복 항목 먼저 지우기 또는 먼저 정렬:
std::unique 알고리즘의 시간 복잡도는 O(n)이므로 정렬하기 전에 중복 항목을 삭제하는 것이 일반적으로 시간 복잡도 측면에서 더 효율적입니다. 여기서 n은 입력 벡터의 크기. 하지만 벡터가 정렬된 상태를 유지하려면 중복된 항목을 삭제한 후 정렬이 필요합니다.
3. 세트 사용:
링크된 답변에서 언급했듯이 std::set을 사용하면 중복이 심각한 대형 벡터를 처리하는 데 더 효율적일 수 있습니다. 세트는 요소를 삽입할 때 중복 항목을 자동으로 제거합니다. 벡터를 집합으로 변환하고 요소를 삽입한 다음 다시 벡터로 변환하여 단일 단계로 중복 제거 및 정렬을 수행할 수 있습니다.
성능 비교:
다양한 접근 방식(고유한 정렬을 사용한 벡터, 수동 집합 변환, 집합 생성자 변환)을 벤치마킹하면 중복 수가 상당할 때 집합으로 변환하고 데이터를 벡터에 다시 덤프하는 것은 벡터 기반 기술을 사용하는 것보다 놀라울 정도로 빠릅니다.
결론적으로, 중복이 많은 대형 벡터의 경우 세트를 사용하는 것이 중복을 지우고 정렬하는 가장 효율적인 방법을 제공합니다. 또한 수동 집합 변환은 집합 생성자를 사용하는 것보다 빠른 경향이 있습니다.
위 내용은 C에서 큰 벡터를 효율적으로 중복 제거하고 정렬하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!