如何使用python在O(1)时间内找到多少整数落在[a…b]范围内?

如何使用python在O(1)时间内找到多少整数落在[a…b]范围内?,python,Python,我有下面的代码,我试图找出在数组使用计数排序后,如何使用python在O(1)时间内找到多少个整数落在[a…b]范围内。我应该对数组进行排序,然后看看有多少整数落在这个范围内 def CountingSort(A, B, k): C = [0] * (k+1) for x in range(k+1): C[k] = 0 for j in range(0,len(A)): C[A[j]] = C[A[j]] + 1 fo

我有下面的代码,我试图找出在数组使用计数排序后,如何使用python在O(1)时间内找到多少个整数落在[a…b]范围内。我应该对数组进行排序,然后看看有多少整数落在这个范围内

def CountingSort(A, B, k):
   
    C = [0] * (k+1)
    for x in range(k+1): C[k] = 0

   
    for j in range(0,len(A)): 
        C[A[j]] = C[A[j]] + 1

   
    for i in range(1, k+1):
        C[i] = C[i] + C[i-1]
    
   
    for j in range(len(A)-1, -1, -1):
        B[C[A[j]]-1] = A[j]
        C[A[j]] = C[A[j]] - 1



arr=[ 3, 1, 3, 0, 1, 0, 1, 2, 3, 4, 5, 0, 2 ]
res=[0] * (len(arr))

CountingSort(arr, res, 5)

print(res)

a = int(input("Enter value for a (lower value) in range:"))
b = int(input("Enter value for b (higher value) in range:"))
print("The value for A entered is:",a)
print("The value for B entered is:",b)
def CountRange(a,b):

 
 for a,b in range ((len(res))):
   
        return res[b] - res[a-1]

CountRange(a,b)
我不确定如何在范围内进行计数。我知道要实现它,我需要做C[B]–C[A-1],但我不确定如何在函数中做到这一点,因为我是python新手

我必须创建另一个函数还是可以继续使用CountingSort函数


当我尝试上面的代码时,我得到以下错误:无法解压缩不可编辑的int对象

计数排序算法有一个有用的部分:它在
C
中计数频率。但是它不返回该信息,只返回一个排序列表。对于范围计数,排序列表不会帮助您实现O(1)的时间复杂度

您应该使用每个值的频率来计算运行总和。这样,您就知道每个值前面有多少个数字(按排序顺序)。这是您需要的信息,而不是排序列表。使用该运行频率和信息,您可以在不使用任何循环的情况下执行减法:

def count_less(lst, high):
    res = [0] * (high+1)

    for val in lst:
        res[val] += 1

    # make running sum
    running = 0
    for val, count in enumerate(res):
        running += count
        res[val] = running
    return res

def count_range(res, a, b):
    return res[b] - (res[a-1] if a > 0 else 0)

lst=[ 3, 1, 3, 0, 1, 0, 1, 2, 3, 4, 5, 0, 2 ]
res=[0] * len(lst)

res = count_less(lst, 5)

print(res)

a = int(input("Enter value for a (lower value) in range:"))
b = int(input("Enter value for b (higher value) in range:"))
print("The value for A entered is:",a)
print("The value for B entered is:",b)

print(count_range(res, a, b))

谢谢你的回答,它是有效的,但我需要首先对列表进行排序,因为它使用CountingSort算法。“我是必需的”:你应该在问题中明确说明我们的限制。我想我是这样做的,抱歉,但是没有理由你不能首先调用CountingSort函数。只需调用它,然后继续执行此代码。关键是,如果你不去计算每个数字的频率,计数排序不会让你更接近。而且,在未排序的列表和排序的列表上,您可以做得一样好。没关系。哦,好吧,我的代码中缺少了得到O(1)的运行总和。非常感谢您的帮助和解释。我开始明白我错在哪里了。