【问题标题】:Best way to find difference between two values in a cyclic system?找到循环系统中两个值之间差异的最佳方法?
【发布时间】:2021-02-17 09:47:56
【问题描述】:

以时间为例:如果我们有开始时间和结束时间,那么找出它们之间的小时数的最佳方法是什么?

如果我们采用 12 小时制,我们会得到以下结果

  • 从 1 到 5 = 4
  • 从 11 到 1 = 2

最有效的方法是什么?

【问题讨论】:

  • 如果您的输入始终是整数,那么您将很难胜过 在预先计算的数组中查找 方法。

标签: c++ c algorithm


【解决方案1】:

假设输入已经在 1-12 范围内,您可能会这样做

return b - a + (b < a) * 12;

benchmark 的性能提升是 cigien 的 solution 的 2 倍。

【讨论】:

  • 仍然很难回答问题中“最有效”的部分;)此外,您还应该提及您的基准测试正在比较的其他解决方案。
  • @cigien 与您的解决方案((b + 12) - a) % 12 进行比较,他的解决方案快1.9 倍,但我不知道使用在编译时解决的const_expr 是否非常可靠,测试应该在运行时完成。
  • @DavidRanieri 是的,我知道,但答案应该包含该信息。 constexpr 在这里并没有什么区别,因为基准测试使用可变参数调用函数,所以所有调用都发生在运行时。
  • @cigien 哎呀,我没注意那个volatile
【解决方案2】:

假设时钟为 12 小时制,则从 ab 的小时数可以计算为:

difference = ((b + 12) - a) % 12;

这也假设ab 都在[1, 12] 范围内。如果不是,您可以这样做:

a %= 12;
b %= 12;

在进行差异计算之前。

【讨论】:

  • 接近但不完美:godbolt.org/z/ETvc3r 问题是确切的要求是什么(仍然失败不是预期的)。
  • @MarekR 这是获得“前向”差异,而不是最小差异。 1 比 5 是 4,但 5 比 1 是 8。
  • @MarekR 我不认为这就是 OP 的意思。他们想要第一个值第二个的小时数。否则 OP 的第二个预期输出将是 10 而不是 2。
  • 它做了正确的事,但我想知道是否有更有效的方法,也许,涉及一些诡计
  • @cigien: “好的,那么我的回答是最有效的方法:)” 我打败了你Demo ;-)
猜你喜欢
  • 2021-02-18
  • 2019-11-27
  • 2012-02-08
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2017-04-18
相关资源
最近更新 更多