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

What is the fastest method of getting first n items in the calculated list?

本文关键字:方法 是什么 计算 列表 获取      更新时间:2023-10-16

我正在做以下任务:

对于list1中的每个项目,查找list2中项目的第一个n最佳匹配

项目本身相当大(每个大约 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

有一种更快的方法来执行第 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::p riority_queue。

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

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