私は問題を抱えていますが、私は基数ソートアルゴリズムから実装を作成しますが、私はメモリを減らすことができます。しかし、...私はこれを使用した後にベクトルの要素を消去します。問題: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++の私の第二章です...学んでいます。だから誰かがもっと複雑な解決策を持っているなら...それを使う方法を学ぶことができますが、難しさは重要ではありません。 消去せずに
結果:消去して
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を作成して、各桁に消去/割り当てを行わないようにすることができます。メモリの割り当てと解放のオーバーヘッドはおそらくランタイムを傷つけるでしょう。 – user3336523
@PaulMcKenzieこの編集はほぼ完了ですが、より良いアイデアを得ることができます。 –