首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -获取堆中小于n的最大数。

Python -获取堆中小于n的最大数。
EN

Stack Overflow用户
提问于 2015-11-10 09:37:13
回答 7查看 1.7K关注 0票数 4

我很难在Python中找到以下功能:

给定一组数字,返回小于或等于n的最大数,如果不存在这样的数字,则返回None

例如,给定列表[1, 3, 7, 10]n = 9,函数将返回7。

我正在寻找类似于TreeSet.lower的Python功能。

我可以使用另一种数据结构。一堆似乎是合适的。

O(n)解对于问题的规模来说太慢了。我在找一个O(log )的解。

背景

我在做https://www.hackerrank.com/challenges/maximise-sum。可能的值范围为1-10^14,因此使用排序列表进行二进制搜索太慢了。

我目前的想法是直接在Python的heapq支持数组上迭代。我希望可能有更多的毕达通。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-11-10 09:56:29

我认为您可以使用二叉树库进行以下操作:https://bitbucket.org/mozman/bintrees/src

例子:

代码语言:javascript
复制
tree = bintrees.RBTree()
In [10]: tree.insert(5,1) 
In [11]: tree.insert(6,1) 
In [12]: tree.insert(10,1)
tree.ceiling_item(5)  -> (5,1)

这个操作的复杂性是O(logN)

票数 3
EN

Stack Overflow用户

发布于 2015-11-10 09:48:47

代码语言:javascript
复制
nextLowest  = lambda seq,x: min([(x-i,i) for i in seq if x>=i] or [(0,None)])

用法:

代码语言:javascript
复制
t = [10, 20, 50, 200, 100, 300, 250, 150]
print nextLowest(t,55)
> 50

我从一个相似问题中获取上面的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2015-11-10 09:47:25

如果你不能对数组的排序做任何假设,那么我认为你能做的最好的就是O(n):

代码语言:javascript
复制
def largest_less_than(numlist, n):
    answer = min(numlist, key=lambda x: n-x if n>=x else float('inf'))
    if answer > n:
        answer = None
    return answer

如果问题是在同一数据集中重复获取最大(小于)不同n值的值,那么可能有一种解决方案是使用桶分类将列表按O(n)排序,然后重复使用bisect

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33626880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档