c++ 算法:搜索"列表"的子集,无序
c++ Algorithm: searching for a subset of a 'list', non-ordered
更新:我的坏消息。这并不是双减速的原因。我还有其他虫子。
C++MFC。Visual Studio 12。
我正试图在绘制循环中优化性能。我有一个我所有对象的列表(ListAll),假设它有300个对象,所有对象都有唯一的ID。我有第二个需要渲染的ID列表(ListNow),大小为100。ListNow中的所有值都有关联的对象存储在ListAll中。
当前,ListAll是一个CMap<UINT、UINT、Object*、Object*>和ListNow是一个CArray<UINT,UINT>。
// this is the slower, current method
for (int i = 0; i < ListNow.GetSize(); i++)
{
UINT id = ListNow.GetAt(i);
if (ListAll->Lookup(id, object))
{
object->draw();
}
}
在过去,我只有ListAll(CMap),我对其中的每个对象都调用draw()。它只有我想要绘制的100个,每次切换绘制的内容时我都会"重建"它。
// this is the faster, old method
POSITION pos = ListAll->GetStartPosition();
while (pos)
{
ListAll->GetNextAssoc(pos, id, object);
object->Draw();
}
从技术上讲,这两种算法都以O(n)速度运行。。。但简单地将CMap::Lookup函数添加到循环中,所花费的时间就增加了一倍。我已经正确地将我的CMap大小设置为一个素数,该素数大于CMap中对象的数量。这种放缓在30万及以上的名单上是显而易见的。
我切换到这个系统,这样我就可以将所有对象存储在绘制列表中,并可以使用相同的对象列表在不同窗口之间快速切换。这大大加快了切换时的时间,但减缓了每个单独的平局呼叫。现在换回来不是一种选择,我们知道这会让每次抽签都慢一点,但不会慢那么多。减速肯定在我向您展示的代码中,因为当我切换回绘制所有内容(删除查找)时,它将时间减半。
我提高性能的唯一想法是将LastDrawn对象指针记录在列表中,并通知函数是否需要更改(调用lookup())或是否可以简单地重复使用上次绘制的指针(GetNext())。自从90%的时间以来,两次通话之间没有任何变化。
有没有比这更快的解决方案?我梦想着一个棘手的位掩码解决方案,它以某种方式产生我想要的对象指针,我不知道。在这一点上,任何事情都会有所帮助。
如果将对象的指针而不是它们的ID存储到ListNow
中,问题似乎就会得到解决。
- 递归无序映射
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- c++找不到具有相同哈希的无序集合元素
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 如何使用set实现无序数据结构?
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- 如何禁用 CPU 的无序执行
- 在子集化后将包含索引号的列表列表映射到标准索引序列
- 显示字符串的集合和子集
- 从C++无序集合中高效提取元素
- 打印无序映射的第二个元素,即集合
- 当我将其插入无序地图时,矢量的容量为 0
- 用于子集字符串的 Rcpp 函数
- 代码块中无序多集的编译错误17.12
- 为什么我的子集和方法不正确?
- 由并发无序映射查找线程调用的函数是否安全?
- 如何按值对无序哈希映射进行排序
- 计算总和为 x 的所有整数子集(包括负数)
- c++ 算法:搜索"列表"的子集,无序