关于代码的一些优化(计算向量的等级)?

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。如果可以避免寄存器溢出,那可能会缩短一到两纳秒。不过说真的,它可能是局部性的,在排序之后,你使用xindsranks,它们可能会相互推出缓存。 @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] &gt; xi 永远是真的吗? @ahenderson:嗯,不完全是:x[j] == xi 可能成立。似乎这些是影响所需排名的值。 @ahenderson 可能存在相等值的条纹。 不,因为存在平局,代码的确切用途是调整平局,请参阅此处了解平局:answers.com/topic/tied-rank

以上是关于关于代码的一些优化(计算向量的等级)?的主要内容,如果未能解决你的问题,请参考以下文章

稀疏向量计算优化小结

一个向量与多个向量的余弦相似度的快速计算[关闭]

Java中的向量距离计算-优化

在更好的优化标志和OpenMP之后,向量的计算变得更慢。

ML-9-3支持向量机--SMO算法原理

V3.15.1 版本 增加了针对华为设备的优化代码