获取计算列表中的前 n 项的最快方法是什么
What is the fastest method of getting first n items in the calculated list?
我正在做以下任务:
对于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 中删除项目(或以某种方式标记它们)可能是合理的,这样它们就不会再次匹配。当然,除非您想要并期望重复匹配。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过JNI传递数据数组的最快方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- 从长整整转换为uint64_t的推荐方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?