获取计算列表中前n项的最快方法是什么?

时间:2014-02-14 13:04:02

标签: c++ algorithm qt sorting optimization

我正在完成以下任务:

对于list1中的每个项目,找到n

中项目的第一个list2最佳匹配项

项目本身相当大(每个大约1.5 kb),并且有一个比较功能。

到目前为止我一直在做的事情,可以用下面的伪代码表示:

for every item1 in list1 {
    for every item2 in list2 {
        put index of item2 in index_buffer
        put match(item1,item2) in value_buffer
    }
    sort index_buffer by value_buffer
    put first n of index from index_buffer, value_buffer(index) in result_ buffer 
}

我想知道,有什么更好/更快的方法。

我使用的语言是c ++,Qt是一个框架。我确信在matlab中执行相同数据的相同任务的速度要快4倍,但情况并非如此。

以下是相关代码:http://pastebin.com/xsWsWzgp

1 个答案:

答案 0 :(得分:1)

有一种更快的方法来完成您的步骤2.实际上,您将它与步骤1结合起来。

现在你保留所有结果,对它们进行排序,然后选择要放入输出缓冲区的前N个。你可以做的是创建一个包含N个项目的优先级队列,并保持到目前为止找到的前N个。在伪代码中,它看起来像这样:

for every item1 in list1 
{
    create empty priority queue to hold n items
    for every item2 in list2 
    {
        value = match(item1, item2)
        if priorityqueue length < n
            add value and index to priority queue
        else if value > lowest value currently in priority queue
        {
            remove lowest value from priority queue
            add new value and index to priority queue
        }
    }
    add items from priority queue to result buffer
}

查看STL std::priority_queue

如果请求的项目数(n)远小于list2的长度,那将为您节省大量时间。

正如其他人所指出的那样,在匹配时从list2中移除项目(或以某种方式标记它们)可能是合理的,这样它们就不会再次匹配。除非您想要并期望重复匹配。