【发布时间】:2014-03-26 21:23:49
【问题描述】:
我得到了一个项目来研究当前用于存储数据的容器的替代方案,以提高其效率。
当前的设计包含 4 个这样的嵌套地图
map< string, map< string, map< int, map< string, string> > > >
让我们将每个数据字段命名为Company、Department、ID_of_employee、Name
目前检索给定Company、Dept、ID 的员工姓名的时间复杂度为 O(log N) 和更准确地说,它涉及三个查找。
目前空间复杂度不是问题。
我最初的选择如下:
- 使用嵌套对来表示
Company、Dept、Id,然后使用这个嵌套对作为映射的键。不过,这似乎不太容易阅读。 - 我考虑使用
tuple或struct而不是嵌套对,这与我阅读的内容基本上没有什么不同。创建new struct EmployeeKey后,将包含Company、Dept、ID的字段。我可以将它用作Key到map。 (我想我也必须编写自定义比较和小于运算符)。 - 通过将
int转换为string并将它们连接起来,使用company+Dept+ID中的连接键。然后将此密钥提供给map<ConcatenatedKey, Data> - 使用Boost.MultiIndex。尽管这似乎是最好的选择,但我放弃了这个选择,因为我发现它有点复杂。
提供更多必要的信息。这个 Container 通常用于检索最终的嵌套数据,这就是我总结使用连接键方法的原因。我的问题基本上是,使用这种连接字符串有什么注意事项吗?这是一个糟糕的设计还是我们应该避免的?
据我了解,这将改善查找时间,仍然保持对数,但执行一次而不是四次查找,因此这似乎是一种改进。
【问题讨论】:
-
如果您正在寻找实际性能,则字符串长度会发挥作用。还有什么是最重要的:插入、查找或删除?
-
你让我们阅读这个广泛的问题,但学习
multi index boost library太复杂了?您可以尝试使用unordered_map对字符串进行哈希处理以提高性能 -
"据我了解,这将缩短查找时间,..." log(abc) = log(a) + log(b ) + 对数 (c)。只是说。
-
如果您使用连接键,请确保以不会混淆子键的方式进行操作。例如,考虑“Department X5”中的员工“501”和“Department X”中的另一个员工“5501”的人为示例,他们恰好都被命名为“Jane Doe”。
-
幸运的是,他们不会混淆,因为 ID 和 Dept 对长度有严格的规定。 @Zeta 你完全正确,这并不能提高性能...@captain giraffe 插入和查找是最重要的!
标签: c++ stl containers