2

我在数据库的 boost 共享内存中存储了大约 800,000 行数据。数据格式如下:

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的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 是否会增加算法的执行时间。

在这种情况下,我可以考虑哪些其他选择?我读到了哈希表、B-Tree、二叉搜索树,我很困惑哪个适合这种情况。kd-tree 在这种情况下会有帮助吗?因为许多图像可能具有相同的颜色、长度和大小组合。我不确定 kd-tree 是否正确。我在用于 kd-tree 的 opencv 中阅读了有关 FLANN 的信息,在这种情况下是否有任何示例或资源可能有用?或者是否有任何内置的 C++ 库?

4

2 回答 2

0

听起来你只是这样做了一次。如果是这种情况,那么创建包含所有元素的任何数据结构都将比测试每个元素慢。确保在其中任何一个元素失败后继续下一个元素(在 C/C++ 中,带有 color==1 && length==2 && size==4 的 if 语句将自动为您进行短路评估)。一次将数据读入缓冲区,而不是一行或任何内容。向零循环并使用指针来避免解析数组索引时的隐式乘法。除此之外,没有想到任何优化。

于 2014-03-14T02:12:20.830 回答
-1

除了遍历每个数据项并根据复杂度为 O(n) 的过滤器检查它之外,没有更快的方法来过滤数据。您必须至少访问每个项目一次。从您的数据(例如树、哈希表等)构建任何类型的数据结构也是如此。如果您只对过滤一次数据感兴趣,只需查看它并获取过滤后的列表。如果您需要执行其他数据操作,您应该考虑您将需要哪些操作(插入、删除、排序等)并根据您的预期用途选择最有效的数据结构。

于 2014-02-11T12:01:58.727 回答