有一个列表:
ranges = [(0,11), (11, 20), (20, 35), (35, 40), (40, 50), (50, 62), (62,
75), (75, 83), (83, 90), (90, 100)]
例如,(7,8)表示7 <= x <8。 现在有一个数字n,我想将其分类为不同的范围。
我在想:
ranges = [(0,11), (11, 20), (20, 35), (35, 40), (40, 50), (50, 62), (62,
75), (75, 83), (83, 90), (90, 100)]
n = 22
for pair in ranges:
if pair[0] <= n < pair[1]:
print(f'{n} in the range:{pair}')
其时间复杂度为O(n) 但是,如果存在要分类的数字列表,则时间复杂度变为O(m * n)。在这种情况下,是否有一种简单的方法可以使时间复杂度O(m)?
任何答案都是值得的。
答案 0 :(得分:0)
我认为O(m)不可能实现,但是O(mlogn)可以通过二进制搜索(而不是您建议的线性搜索)进行管理,因为范围列表是“已排序的”
O(mlogn)仍可扩展,因为对大n而言,对数函数的增长非常缓慢,在这种情况下,logn与常数之间没有太大差异。
答案 1 :(得分:0)
如果我是你,我会使用pandas.cut函数。
import numpy as np
import pandas as pd
df = pd.DataFrame(data=your_list, columns=["data"])
bins = np.array([0,11,20,35,40,50,62,75,83,90,100])
df["bucket"] = pd.cut(df.data, bins)
print(df.head())
这应该有效。