不确定这是否是正确的问题。 在Cormen第1056页,我读到如果算法的运行时间是O(k)并且“k”用一元表示,即k 1s的字符串,那么算法的运行时间是0(n),其中“n”是输入大小(以位为单位),如果“k”表示为二进制,则表示为n = lg k + 1,算法的运行时间变为o(2 ^ n)。
所以我怀疑为什么在这种情况下“一元”表示不是首选的,因为它在其他情况下给出了与指数形成对比的多项式时间。
答案 0 :(得分:5)
一元时间给出相对于输入大小的多项式时间,但实际运行时间是相同的,无论使用何种表示。
问题是复杂性是根据输入计算的。使用一元表示时,可以增加输入的大小,而不会更改运行时间。
由于在一元基数中表示k
,您需要n
位,O(k)
为O(n)
- 因为它在输入大小上是线性的。但是,对于相同的解决方案,它将为O(k) = O(2^logk) = O(2^n)
,如果您使用二进制表示,因为您需要logk
位来表示k
。
您所描述的内容与pseudo-polynomial time算法密切相关,例如knapsack使用动态编程的解O(W*n)
,它是伪多项式,因为它实际上是指数用于表示W
的位数。