如何使用python在O(1)时间内找到多少整数落在[a…b]范围内?
我有下面的代码,我试图找出在数组使用计数排序后,如何使用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
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)的运行总和。非常感谢您的帮助和解释。我开始明白我错在哪里了。