我正在完成以下任务:
对于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
答案 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中移除项目(或以某种方式标记它们)可能是合理的,这样它们就不会再次匹配。除非您想要并期望重复匹配。