关于代码的一些优化(计算向量的等级)?
Posted
技术标签:
【中文标题】关于代码的一些优化(计算向量的等级)?【英文标题】:Some optimization about the code (computing ranks of a vector)? 【发布时间】: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
,您应该会加快一些速度。
【参考方案1】:
该算法似乎具有二次行为:如果x[0]
是序列中的最大值,则tj
保持0
,并且您在内部最多可以进行ci
迭代。您的意思是使用x[inds[0]]
和x[inds[j]]
?
【讨论】:
不,mergeSort() 接受指针输入,它将改变 x 中的值,x[0] 将是向量(原始)x 的最小值,而 x[ci] 是最大值. @user1748356 这不意味着x[j] > xi
永远是真的吗?
@ahenderson:嗯,不完全是:x[j] == xi
可能成立。似乎这些是影响所需排名的值。
@ahenderson 可能存在相等值的条纹。
不,因为存在平局,代码的确切用途是调整平局,请参阅此处了解平局:answers.com/topic/tied-rank以上是关于关于代码的一些优化(计算向量的等级)?的主要内容,如果未能解决你的问题,请参考以下文章