获取计算列表中前 n 个项目的最快方法是啥?

Posted

技术标签:

【中文标题】获取计算列表中前 n 个项目的最快方法是啥?【英文标题】:What is the fastest method of getting first n items in the calculated list?获取计算列表中前 n 个项目的最快方法是什么? 【发布时间】:2014-02-14 13:04:01 【问题描述】:

我正在处理以下任务:

对于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

【问题讨论】:

项目是否可排序?然后首先排序并使用二进制搜索算法查找。可能会更快。 遗憾的是,它们不可排序。我唯一能从他们那里得到的是他们从匹配函数中得到的“相似度分数” 如果一个 item2 只能匹配一个 item1,并且假设你的 match 函数很昂贵,你可以在 item2 上创建一个标志来判断它是否已经被匹配,以避免再次调用 match 函数跨度> 在 MATLAB 中实现的解决方案是否使用相同的算法? 好吧,正如您所描述的,这是一个nearest neighbor search 问题:由于您从list1 进行了大量查询,因此提前组织list2 以便执行每个查询是有意义的快点。这是一个完整的研究领域,但是如果您的相似度函数对应于一个度量,那么可以应用几种方法,大多数基于树结构。具体示例见vp-tree。 【参考方案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 中删除项目(或以某种方式标记它们)可能是合理的,这样它们就不会再次匹配。当然,除非您想要并期望重复匹配。

【讨论】:

我会试试这个并报告结果。 我原来的问题没有用这个,但是后来很方便。谢谢!

以上是关于获取计算列表中前 n 个项目的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 8000 个项目列表中加载 NSComboBox 的最快方法

获取递归包含在目录中的文件列表的最快方法是啥?

计算行列式的最快方法是啥?

删除列表中前 N 个元素的最有效方法?

在给定稀疏矩阵数据的情况下,Python 中计算余弦相似度的最快方法是啥?

在 python 或 spark 中获取大数据缺失值的最快方法是啥?