【发布时间】:2012-12-12 22:32:41
【问题描述】:
下面的代码是一个计算向量绑定秩的函数(性能关键):
//The function here is to compute tied-ranks: answers.com/topic/tied-rank
mergeSort(x,inds,ci);
//mergeSort(): to sort vector x of length ci, also returns keys (inds) of x.
int tj=0;
double xi=x[0];
for (int j = 1; j < ci; ++j)
{
if (x[j] > xi)
{
double rankvalue = 0.5 * (j - 1 + tj);
for (int k = tj; k < j; ++k)
{
ranks[inds[k]] = rankvalue;
};
tj = j;
xi = x[j];
};
};
double rankvalue = 0.5 * (ci - 1 + tj);
for (int k = tj; k < ci; ++k)
{
ranks[inds[k]] = rankvalue;
};
问题是,假设的性能瓶颈 mergeSort(),即 O(NlogN),比其他部分代码(即 O(N))快几倍,这表明使用代码的其他部分,有什么建议吗?
【问题讨论】:
-
SO 不是代码审查的地方。请提出具体的技术问题。
-
你的代码的另一部分看起来像是在 O(N*N) 中运行
-
怎么样?它最多对向量中的数据进行 N 次调整。
-
您可以消除循环计数器
k并为此使用tj。如果可以避免寄存器溢出,那可能会缩短一到两纳秒。不过说真的,它可能是局部性的,在排序之后,你使用x、inds和ranks,它们可能会相互推出缓存。 -
@user1748356 你有两个
for-loops忽略if运行时间是 [n + n-1 + n-2 + ... + 1] 这是 O(n^2 )。除非您知道 'if 语句触发最坏情况的运行时间为 O(n^2) 的频率。如果您以某种方式消除if-statement,您应该会加快一些速度。
标签: c++ c sorting optimization