高效的排名算法(PHP)


Efficient ranking algorithm (in PHP)

我有一个员工计算数据的PHP数组(从数据库中检索)。每个员工大约有10列,其中8列是数字(另外2列是id和name)。这是一个简短的例子:

大卫:1024,75,22迈克:500、100、25杰夫:700、82、10

我可以很容易地对任何(数字)字段上的数组进行排序,以显示谁在顶部/底部,但我真正想在最终的表视图中显示的是按值排序,这样人们就不必对表进行排序和重新排序来获得他们想要的。以下是按第一列排序的表格示例,括号中显示排名:

大卫:1024(#1),75(#3),22(#2)杰夫:700(#2)、82(#2)和10(#3)迈克:500(#3)、100(#1)、25(#1)

现在,我知道最简单的方法就是按列对表进行排序,使用行索引作为排名,并按每列重复。我只是想知道我是否能找到一种更有效的方法。

我考虑过使用有序队列(需要排名的每列一个),扫描一次数组并将值推入队列。但是:

  1. PHP除了数组之外没有任何数据结构(除非使用外部添加)
  2. 我不相信这更有效率

有人能建议最好的方法吗?和/或确认我应该对数组重新排序几次?

谢谢你抽出时间!

好的,经过深思熟虑,我决定走"对每一列进行排序"的路线。为了将来任何感兴趣的人参考,下面是我添加到类中的函数——它在我需要排名的每一列中调用一次:

   private function calculateRankings(&$employees, $columnName) {
        $comparer = "return ('$a[$columnName][0] == '$b[$columnName][0]) ? 0 :  ('$a[$columnName][0] > '$b[$columnName][0] ? -1 : 1);";
        usort($employees, create_function('$a,$b', $comparer));
        foreach($employees as $key => &$employee) {
            $employee[$columnName][1] = $key + 1;
        }
    }

+1是由于键是基于零的。

您可以通过将需要排序的每个字段变成一个2元素数组来准备此函数:第一个([0])包含值,第二个([1])最终将包含排序
即:$employees['salary'] = array(1550, 0);。然后调用函数如下:
CCD_ 2。

我真诚地希望有一天这能帮助到别人。感谢所有回应者/评论者!

UPDATE 4/9:我之前提供的函数无法工作-无法将第三个参数(在我们的例子中是列名)传递到comparer函数中。唯一的方法是使用一个静态类变量,或者我最终得到的create_function破解。很抱歉造成任何混淆。

恐怕您必须坚持最初的方法。

必须遍历所有列并计算每个列的排名信息,这是无法逃避的。

您可以做的是优化算法以更有效地完成该任务。

PS.:尽管性能总是很重要,但我认为该算法的不同寻常之处并不足以让您担心复杂性、增长顺序或运行时间。