以最有效的方式比较两个向量
Comparing two vectors in the most effective way
基本上我正在尝试记录应用程序的动画。我是通过逐帧记录来做到这一点的。
所以我要做的是记录一帧(动画的所有元数据)并将其与前一帧进行比较。如果任何对象不在上一帧中,那么我会保存它们并用它们做一些我不想让你们知道的事情:P
现在的问题是时间效率。我希望能够在半秒内完成此函数,因为它必须在半秒后再次调用。框架的大小将得到 1000-1500
.
我检查了set_difference和其他方法,我认为这对我来说还不够,因为首先我有无法排序的元数据,我将不得不进行大量更改,即使我包括排序标准,对 2 个向量进行排序然后比较它们在计算上是昂贵的。
现在我想出的最好的是;
只是一个示例,不是我的真实代码
auto itr1 = list1.begin();
auto itr2 = list2.begin();
for (i; i<total_items;i++)
{
if (*itr1 != *itr2)
do something
itr1++; itr2++;
}
}
这是我想出的最好的,它的复杂性是n。现在,如果两个列表的大小相同,它可以工作。但是,如果最新列表的大小增加,则所有元素都会乱
序,例如a a
b b
c c
d z
e d
f e
g f
如您所见,如果一个新元素入到第二个列表中,那么之后的所有元素都将无序。我似乎找不到一种方法来解决这个问题,同时尽可能减少计算时间。任何帮助将不胜感激。
1) 在大多数情况下,由于处理器的缓存使用率,std::vector
比std::list
快。
2) 对两个数组进行排序。将新元素插入正确的位置以保持排序顺序。
3) 使用二叉搜索来检查向量 1 中是否存在来自 vector2 的元素。
复杂度应该M * log(N)
,其中N是第一个向量的长度,M是第二个向量的长度。
在下面的程序中,复制和移动构造函数以及赋值运算符被删除,以确保我们不会复制或移动大型对象。每帧仅在指针上执行一次排序,并且应该需要最少的时间。
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <iterator>
class MyBigObject {
public:
MyBigObject(char name) : name{name} {};
MyBigObject(const MyBigObject&) = delete;
MyBigObject(MyBigObject&&) = delete;
MyBigObject& operator=(const MyBigObject&) = delete;
MyBigObject& operator=(MyBigObject&&) = delete;
bool operator< (const MyBigObject& rhs) const
{
return name < rhs.name;
}
char name;
char bigdata[100000];
};
void doSomething(const MyBigObject& object)
{
std::cout << "Working on object that was added:" << object.name << 'n';
}
void calculate_frame(const std::set<MyBigObject>& objects)
{
static std::vector<const MyBigObject*> last_frame_objects;
std::vector<const MyBigObject*> new_frame_objects;
std::vector<const MyBigObject*> difference;
std::for_each(objects.begin(),objects.end(),[&new_frame_objects](const MyBigObject& object) {new_frame_objects.push_back(&object); });
std::sort(new_frame_objects.begin(),new_frame_objects.end());
std::set_difference(new_frame_objects.begin(),new_frame_objects.end(),last_frame_objects.begin(),last_frame_objects.end(),
std::inserter(difference,difference.begin()));
for (auto object_ptr : difference) {
doSomething(*object_ptr);
}
last_frame_objects = new_frame_objects;
}
int main()
{
std::set<MyBigObject> objects;
std::cout << "Start of framen";
objects.emplace('a');
objects.emplace('b');
objects.emplace('c');
calculate_frame(objects);
std::cout << "Start of framen";
objects.emplace('d');
objects.emplace('e');
objects.emplace('f');
calculate_frame(objects);
std::cout << "Start of framen";
objects.erase('a');
objects.erase('c');
calculate_frame(objects);
std::cout << "Start of framen";
objects.emplace('c');
calculate_frame(objects);
return 0;
}
生产:
Start of frame
Working on object that was added:a
Working on object that was added:b
Working on object that was added:c
Start of frame
Working on object that was added:d
Working on object that was added:e
Working on object that was added:f
Start of frame
Start of frame
Working on object that was added:c
相关文章:
- 在C++中查找两个向量之间最相似的值
- 如何在C++中从两个向量生成所有可能的对?
- 返回两个向量 – 使用引用还是元组?
- 检查两个向量是否并行的最有效方法
- 如何获得比较两个向量对的子集
- 如何在 c++ 中对两个向量进行线性搜索?
- 如何在 c++ 中从两个向量创建 JSON 对象?
- C++如何同时删除位于两个向量中的 2 个指针?
- 如何通过 stl 容器和算法库计算两个向量的内积?
- 删除两个向量中的重复项
- 两个向量在犰狳中相等?
- 为什么我无法比较自定义类类型的两个向量?
- 通过块比较两个向量时,如何避免重复
- Boost.Test - 如何在交叉点上检查两个向量
- 通过移动从两个向量创建元组向量
- 如何在C 中合并两个向量
- R- armadillo c :用其他两个向量对向量进行排序
- 使用嵌套循环搜索两个向量并查看其属性
- 如何以精度换取速度来评估C++中两个向量的点积符号?(不特定于硬件)
- 我该如何XOR这两个向量的内容