【问题标题】:Optimisation for finding floating key in c++ map在 C++ 映射中查找浮动键的优化
【发布时间】:2013-12-11 12:09:22
【问题描述】:

我想问一个与此相关的问题:Floating point keys in std:map

我用double 作为其他类型MyType 的键创建了一个std::map,即:

map<double,MyType> myMap;

我的问题是: 鉴于myMap.find(...) 是std::map 查找键的优化方法(参见How sets, multisets, maps and multimaps work internally),Floating point keys in std:map 中的方法是否明显未优化?我可以实现一些更高效的东西吗?

【问题讨论】:

  • 我一直认为使用double 作为映射键是个坏主意,因为浮点不精确,它们不满足严格的弱排序。我错了吗?
  • @Bathsheba 链接解决方案建议使用双容差来解决此问题。
  • Map 键必须带有严格的弱排序,double 的默认比较器不是这种情况。当心。
  • @KerrekSB 你能详细说明一下严格的弱点吗?这是因为“特殊”值,如正零和负零,以及 NaN 等,它们在比较中表现得很奇怪吗?或者我错过了什么。 “常规”浮点值?
  • @jalf:只是 NaN。 NaN 破坏了排序。

标签: c++ performance map double stdmap


【解决方案1】:

它没有明显未优化。首先,所有操作的渐近复杂度都是相同的(O(log(n))),只有比较会是一个较慢的常数因素。事实上,我认为您不会变得更好,因为您无法同时以任何更好的安全方式进行双打比较。

【讨论】:

  • 是否也可以确认将双精度转换为字符串并将映射定义为map&lt;string,MyType&gt; myMap; 是否比proposed solution 更有效或更低?我知道字符串转换和字符串比较相对“慢”,但如果使用map::find() 的能力弥补了这一点,那么它可能更有效?
  • 您仍然可以在建议的解决方案中使用 map::find。它将简单地使用自定义比较运算符,但其复杂性仍将符合预期。另一方面,使用字符串会使比较明显变慢(达到双精度字符串表示的长度),并且可能会使您的地图执行得更糟。提出的解决方案已经很好了,不要尝试使用这种“hacky”优化来改进它。
【解决方案2】:

STL 容器在满足标准定义的性能要求的意义上是“优化的”。虽然不能说它们是完美的,但要求已经非常严格(即O(log(N)) 用于地图中的元素搜索),因此重新实现它们将是一项非常忘恩负义的工作。我会说,最好选择最适合您的,然后保持原样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    相关资源
    最近更新 更多