【发布时间】:2022-01-18 09:19:42
【问题描述】:
我正在处理在 C++ 中优化基数排序代码的任务,我需要减少执行时间,我的代码正在运行,它看起来像这样:
void RadixSort::RadixSortNaive(std::vector<long> &Arr) {
long Max_Value = findMax(Arr);
int Max_Radix = 1;
while (1) {
if (Max_Radix >= Max_Value) break;
Max_Radix = Max_Radix*radix_;
}
for (int i = 1; i < Max_Radix; i = i*radix_) {
for (int j = 0; j < key_length_; j++) {
int K;
if (Arr[j] < i) K = 0;
else K = (Arr[j] / i) % radix_;
Q[K].push(Arr[j]);
}
int idx = 0;
for (int j = 0; j < radix_; j++) {
while (Q[j].empty() == 0) {
Arr[idx] = Q[j].front();
Q[j].pop();
idx++;
}
}
}
class RadixSort{
public :
void setConfig(int key_length, int radix) {
key_length_ = key_length;
radix_ = radix;
for (int i = 0; i < radix_; i++) {
Q.push_back(std::queue<long>());
}
}
long findMax(std::vector<long> Arr) const {
long Max = 0;
for (int i = 0; i < key_length_; i++) {
if (Max < Arr[i])
Max = Arr[i];
}
return Max;
}
void RadixSortNaive(std::vector<long> &Arr);
void RadixSortStudent(std::vector<long> &Arr);
private:
int key_length_;
int radix_;
std::vector<std::queue<long>> Q;
};
}
但是,我确信仍有改进的余地。我一直在尝试使用 OMP 库实现并行化,但似乎没有任何效果。有什么办法可以改进以前的代码吗?也许改进循环或任何其他代码优化技术。
【问题讨论】:
-
findMax通过值而不是引用获取向量 -
multi-threaded radix sort 的示例代码,但它使用 Windows 本机线程。您可以将其用作基准基准。它对 64 位无符号整数进行排序,并且不考虑最大值,这将有助于减少通过次数,但由于它们是并行的,因此可能没有太大区别。
标签: c++ algorithm optimization radix-sort acceleration