문제가 있습니다. 기수 정렬 알고리즘을 사용하여 구현을 만들었지 만 메모리를 덜 사용할 수 있다고 생각합니다. 하지만 ... 나는 이것을 사용하여 벡터의 요소를 지워 버린다. 문제 : 실행 3 분 17 초. 요소를 빨리 지우는 방법은 무엇입니까? 또는 ... 어떻게 더 나은 메모리를 사용합니다.벡터에서 요소를 지우거나 메모리를 더 잘 사용 (기수 정렬)
sort.hpp
#include <iostream>
#include <vector>
#include <algorithm>
unsigned digits_counter(long long unsigned x);
void radix(std::vector<unsigned> &vec)
{
unsigned size = vec.size();
if(size == 0);
else {
unsigned int max = *max_element(vec.begin(), vec.end());
unsigned int digits = digits_counter(max);
// FOR EVERY 10 POWER...
for (unsigned i = 0; i < digits; i++) {
std::vector < std::vector <unsigned> > base(10, std::vector <unsigned>());
#ifdef ERASE
// GET EVERY NUMBER IN THE VECTOR AND
for (unsigned j = 0; j < size; j++) {
unsigned int digit = vec[0];
// GET THE DIGIT FROM POSITION "i" OF THE NUMBER vec[j]
for (unsigned k = 0; k < i; k++)
digit /= 10;
digit %= 10;
// AND PUSH NUMBER IN HIS BASE BUCKET
base[ digit ].push_back(vec[0]);
vec.erase(vec.begin());
}
#else
// GET EVERY NUMBER IN THE VECTOR AND
for (unsigned j = 0; j < size; j++) {
unsigned int digit = vec[j];
// GET THE DIGIT FROM POSITION "i" OF THE NUMBER vec[j]
for (unsigned k = 0; k < i; k++)
digit /= 10;
digit %= 10;
// AND PUSH NUMBER IN HIS BASE BUCKET
base[ digit ].push_back(vec[j]);
}
vec.erase(vec.begin(), vec.end());
#endif
for (unsigned j = 0; j < 10; j++)
for (unsigned k = 0; k < base[j].size(); k++)
vec.push_back(base[j][k]);
}
}
}
void fancy_sort(std::vector <unsigned> &v) {
if(v.size() <= 1)
return;
if(v.size() == 2) {
if (v.front() >= v.back())
std::swap(v.front(), v.back());
return;
}
radix(v);
}
sort.cpp 난 그냥 배우고
#include <vector>
#include "sort.hpp"
using namespace std;
int main(void)
{
vector <unsigned> vec;
vec.resize(rand()%10000);
for (unsigned j = 0; j < 10000; j++) {
for (unsigned int i = 0; i < vec.size(); i++)
vec[i] = rand() % 100;
fancy_sort(vec);
}
return 0;
}
... 그것은 Deitel C의 제 2 장 ++입니다. 그래서 ... 누군가가 더 복잡한 해결책을 가지고 있다면 ... 어떻게 사용 하는지를 배울 수 있습니다. 어려움은 중요하지 않습니다. 삭제하지 않고
결과 : 삭제와
g++ -O3 -Wall sort.cpp && time ./a.out
./a.out 2.93s user 0.00s system 98% cpu 2.964 total
는 :
g++ -D ERASE -O3 -Wall sort.cpp && time ./a.out
./a.out 134.64s user 0.06s system 99% cpu 2:15.20 total
프로그램을 만들 때 사용한 최적화 작업은 무엇입니까? 그것이 "디버그"또는 최적화되지 않은 빌드 인 경우 그 결과는 의미가 없습니다.또한 정렬 할 번호의 수를 언급하지 못했고 [mcve]도 게시하지 않았습니다. – PaulMcKenzie
고정 된 크기의 std : vector를 만들 수 있으며 각 자릿수에 대해 erase/alloc을 수행하지 않을 수 있습니다. 메모리를 할당하고 해제하는 오버 헤드로 인해 런타임이 손상 될 수 있습니다. – user3336523
@PaulMcKenzie이 편집은 거의 완료되었지만 더 좋은 아이디어를 얻을 수 있습니다. –