【问题标题】:Data Structure to Find Next Greatest Value Below Arbitrary Number查找任意数以下的下一个最大值的数据结构
【发布时间】:2013-10-03 11:19:09
【问题描述】:

我正在尝试寻找一种数据结构以在我的 Java 项目中使用。我正在尝试做的是从一组数字中获取低于任意数字的下一个最大值,或者如果不存在这样的数字则通知。

示例 1) 我的任意数字是 7.0。 {3.1、6.0、7.13131313、8.0} 我需要从这组中得到的数字是 6.0。

示例 2) 我的任意数字是 1.0。 {2.0, 3.5555, 999.0} 集合中不存在下一个最高的数字,所以我需要知道它不存在。

我能想到的最好的方法是通过数组进行索引和比较,然后在我遍历任意数字后返回 1 步。在最坏的情况下,虽然我的时间复杂度是 O(n)。有没有更好的办法?

【问题讨论】:

  • 为什么不使用二分搜索?
  • 维护一个搜索树,如果没有,实现一个前置函数。

标签: java algorithm data-structures time-complexity


【解决方案1】:

如果您可以预处理值列表,那么您可以对列表进行排序(O(NLogN) 时间)并执行二进制搜索,这将为您想要获得答案的每个值获取 O(LogN)。否则你不能比O(N)做得更好。

【讨论】:

    【解决方案2】:

    您首先需要对数字进行排序。 然后你可以做一个简单的二分搜索,它的比较功能根据你的需要进行了修改。在每一点检查元素是否大于输入,如果是则在左侧或右侧搜索。最后,您修改后的二进制搜索应该能够提供立即更大和更小的数字,您可以使用它轻松解决您的问题。复杂度为 lg n。

    【讨论】:

      【解决方案3】:

      我建议您查看TreeSet.floor(...)TreeSet.lower(...)。其中之一应该满足您的要求,并且两者都具有O(logN) 复杂性......假设您已经构建了TreeSet 实例。

      如果您只有一个排序数组,并且不希望构建 TreeSet 的开销,那么自定义二进制搜索可能是最好的选择。

      【讨论】:

        【解决方案4】:

        您的两个示例集看起来都已排序...

        如果是这种情况,那么您将需要二进制搜索... 如果不是这种情况,那么您需要准确地访问每个元素一次。所以这需要时间 n..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多