算法效率

时间:2015-05-04 00:09:19

标签: performance sorting

我正在尝试编写具有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

1 个答案:

答案 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) 个术语,因为我不相信输入数组中没有舍入错误。