Java 2^(n)-1的算法是否存在于θӨ;(1)?
所以我有一个关于我应该“发明”/“发现”的算法的问题。这是一个计算ㄊ(n^n)和ㄊ(1)和ㄊ(n)的2^(n)-1的算法 我想了几个小时,但两个任务都找不到任何解决方案(第一个任务,而最后一个任务是easistimo,我在下面发布了算法)。但是我还没有足够的技能去“发明”/“找到”一个非常慢和非常快的算法 到目前为止,我的算法是(伪代码): }(n)的一个 一个简单的,有点明显的,使用递归的,虽然我不知道它有多快(如果有人能告诉我,那就好了): 比如:Java 2^(n)-1的算法是否存在于θӨ;(1)?,java,algorithm,big-theta,Java,Algorithm,Big Theta,所以我有一个关于我应该“发明”/“发现”的算法的问题。这是一个计算ㄊ(n^n)和ㄊ(1)和ㄊ(n)的2^(n)-1的算法 我想了几个小时,但两个任务都找不到任何解决方案(第一个任务,而最后一个任务是easistimo,我在下面发布了算法)。但是我还没有足够的技能去“发明”/“找到”一个非常慢和非常快的算法 到目前为止,我的算法是(伪代码): }(n)的一个 一个简单的,有点明显的,使用递归的,虽然我不知道它有多快(如果有人能告诉我,那就好了): 比如: HugeInt h = 1; h = h
HugeInt h = 1;
h = h << n;
h = h - 1;
HugeInt h=1;
h=h
假设n
不受任何常数的限制(并且输出不应该是简单的int
,而是可以包含大整数的数据类型),则没有算法
在ㄊ(1)
中产生2^n-1
,因为输出本身的大小是
所以如果我们假设有这样的算法,让它
以恒定时间运行,并对n进行小于C
的操作=
2^(C+1)
,您只需执行C+1
操作即可打印
输出,这与C
是上限的假设相矛盾,因此
没有这样的算法
对于ㄊ(n^n)
,如果你有一个更有效的算法(ㄊ(n)
),你可以做一个无意义的循环,运行额外的n^n
迭代,但不做任何重要的事情,它会使你的算法ㄊ(n^n)
还有一种ㄊ(log(n)*M(logn))
算法,使用该值,然后简单地从该值中减去1。这里的M(x)
是包含x位数字的乘法运算符的复杂性
正如@kajacx所评论的,您甚至可以通过应用
}(n^n)对我来说太棘手了,但任何“二进制”体系结构上的真正}(1)算法都是:
return n-1 bits filled with 1
(假设您的体系结构可以在固定时间内分配和填充n-1位)
;) 问题到底是什么?问题是这里是否有人能够找到2^(n)-1的算法,它位于θ}(n^n)或θ}(1),因为不幸的是,我没有足够的能力。如果这个名为Thetas的东西不存在,那么这个也没问题,因为我知道花更多的时间在这个上面是没有意义的。听说了谢谢你的回答,我从来没有想过,这对非常有限的n
的大小有什么作用。事实上,你不能用ㄈ(1)
算法来解决这个问题,因为输出大小本身就是ㄈ(log(n))
@Tim,你有一个非常好的答案,除了你应该为h=1
切换h=2
<代码>1@IwillnotexistIdonotexist如果你想了解复杂性,你不应该把自己限制在可笑的低值n
,因为只有当n
的值足够大时,}符号才有效。这就是渐近复杂性的含义。@Iwillnotexistidnotexist抱歉,但出于这个目的,}(n)和}(1)实际上是相同的,考虑到nAlso,θ不是平均复杂性。它是一个下限和上限,可以应用于任何类型的分析(最佳、平均、最差)。如果我理解正确,算法在3。不记录(n)
乘法,但是当处理任意大的数字时,您不能再在恒定时间内进行乘法。我所知道的最好的是在时间m log(m)
中,其中m
是两个数字的位数,使用让你思考的数学。pow
在ㄊ(1)
时间中运行?还有。。。所以它是关于}(#bits_,of#u,of#u,of#u,of#u,of#u,of#u,of#u,of#u,of#u,of#u,of#u,of#u,bits_,of#u,of#u,of#u,of。总之,我猜测O(n^n)应该重复加法。@C.B.在执行渐近时间复杂度分析时,通常假定访问O(logn)
位的时间为O(1)
。(来源:图形算法博士)我们仍然可以在处理这个问题时做出这样的假设。这里的实际问题是,问题本质上必须处理大量数据,即,如果我们假设O(logn)
位可以在O(1)
时间内访问,则需要O(n/logn)时间来访问O(n)
位,这是表示O(2^n)所必需的。这就是为什么ㄉ(1)
不可能的原因,因为我们需要O(n/logn)时间来输出答案。
HugeInt h = 1;
h = h << n;
h = h - 1;
return n-1 bits filled with 1