我正在尝试查找要在我的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)。还有更好的方法吗?
答案 0 :(得分:4)
如果您可以预处理值列表,那么您可以对列表进行排序(O(NLogN)
时间)并执行二进制搜索,对于您想要获得答案的每个值,将需要O(LogN)
对于。否则你不能比O(N)
做得更好。
答案 1 :(得分:1)
您需要先对数字进行排序。 然后你可以做一个简单的二进制搜索,其比较函数根据你的需要进行修改。在每个点检查元素是否大于输入,如果是,则在左侧或右侧搜索。最后修改后的二进制搜索应该能够提供更大,更小的数字,以便您轻松解决问题。复杂性是lg n。
答案 2 :(得分:1)
我建议您查看TreeSet.floor(...)
或TreeSet.lower(...)
。其中一个应该满足您的要求,并且两者都有O(logN)
复杂性...假设您已经构建了TreeSet
实例。
如果你只有一个排序数组并且不想要构建TreeSet
的开销,那么自定义二进制搜索可能是最好的选择。
答案 3 :(得分:0)
您的两个示例集看起来都是排序的......
如果是这种情况那么你需要二元搜索...... 如果情况并非如此,那么你需要一次访问每个元素。所以需要时间n ..