我正在尝试编写具有O(n + k)效率的代码。函数输入是一个列表,我必须对它进行排序。
众所周知:
x
都是整数或x=y+0.5
k
,(-k)<=x<=(k)
为x
n
是列表中的项目数*原始列表必须保持不变
这是我在for循环中遇到效率问题的代码。 有什么建议吗?
def sort_num_list(lst):
lst2=[n*2 for n in lst] ##O(N)
k=max(abs(i) for i in lst2)##O(N)
lst1=[]
for i in range(-k,k+1):
if i in lst2:
lst2.remove(i)
lst1.append(i)
if i in lst2:
lst1.append(i)
lst1=[n/2 for n in lst1] ##O(N)
return lst1
答案 0 :(得分:1)
我不做python,但是在C ++中应用counting sort的问题会是这样的:
std::accumulate
实际上在实际代码中我可能不会使用std::max_element
来查找最大绝对值。 int k = 0;
for( auto e : input ) k = std::max(k, int(2*e + .1));
无效,因为我们需要绝对的价值观。 ranged for for循环可以轻松解决问题,并且更容易验证正确性。
+.1
有df = data.frame(names = rep(LETTERS[1:3], each=4),
num = c(rep(c("aaa","bbb","ccc","total"), 3)),
values = c(1,2,3,7,2,2,5,10,3,4,2,9)))
p = ggplot(df, aes(x=factor(names))) +
geom_bar(data=subset(df,num=="total"), aes(y=values), stat="identity",width=.5) +
geom_bar(data=subset(df,num!="total"), aes(y=-values,fill=factor(num)), stat="identity",width=.5)
print(p)
个术语,因为我不相信输入数组中没有舍入错误。