我有大约800,000行数据存储在数据库的boost共享内存中。数据采用以下形式:
Id Color Length Size
1 1 2 4
2 3 4 5
3 2 2 0
4 1 2 4......and so on
颜色可以是1-12长度1-4和1-5的值, Id,Length,Color,Size存储在共享存储器中800,000大小的单独矢量中。因此Id有Id矢量,Color有颜色矢量等等。
我想在执行某些计算之前过滤数据。所以我想要的颜色为1,长度为2,大小为4,即上述情况下的第1行和第4行。有没有有效的方法来过滤数据而不使用for循环并遍历所有800,000个图像并检查条件?
现在我只是使用mysql语句来获取满足条件的数据的ID。
"select Id from features_table where Color=1 and Length=2 and Size =4"
但有更快的方法吗?或者我应该坚持这种方法?我正在寻找一种更快的方法,所以我不确定从数据库中获取ID是否会增加算法的执行时间。
在这种情况下,我可以考虑哪些其他选项?我读到了Hash表,B-Tree,Binary Search树,我感到很困惑,这适合这种情况。在这种情况下,kd-tree会有用吗?因为许多图像可能具有相同的颜色,长度和大小组合。我不确定kd-tree是否正确。我在opencv中读到了用于kd-tree的FLANN是否有任何示例或资源可能对这种情况有帮助?或者有没有内置的c ++库?
答案 0 :(得分:0)
听起来你只是这样做了一次。如果是这种情况,那么创建包含所有元素的任何数据结构将比测试每个元素慢。确保在任何一个元素失败后转到下一个元素(在C / C ++中,带有color == 1&& length == 2&& size == 4的if语句将自动短路评估为了你)。将数据读入缓冲区,而不是一次读取一行或任何内容。循环为零并使用指针避免在解析数组索引时的隐式乘法。除此之外,没有想到任何优化。
答案 1 :(得分:-1)
没有更快的方法来过滤数据,除了遍历每个数据项并检查过滤器,这是O(n)的复杂性顺序。您必须至少访问一次每个项目。从您的数据构建任何类型的数据结构也是如此,例如树,哈希表等。如果您只对过滤数据一次感兴趣,只需查看它并获取过滤列表。如果您需要执行其他数据操作,您应该考虑您将需要的操作(插入,删除,排序等),并根据您的预期用途选择最有效的数据结构。