Algorithm 有没有真正的O(n^n)算法?

Algorithm 有没有真正的O(n^n)算法?,algorithm,complexity-theory,big-o,Algorithm,Complexity Theory,Big O,有没有时间复杂度为O(n^n)的真实算法,这不仅仅是一个噱头 我可以创建这样一个算法,比如在O(n^n)/Θ(n^n)中计算n^n: 长n到m的幂(int n,int m){ 如果(m==0)返回1; 长和=0; 对于(int i=0;i

有没有时间复杂度为O(n^n)的真实算法,这不仅仅是一个噱头

我可以创建这样一个算法,比如在O(n^n)/Θ(n^n)中计算n^n:

长n到m的幂(int n,int m){
如果(m==0)返回1;
长和=0;
对于(int i=0;i
(计算10^10需要4分钟以上)


或者反过来说:有没有比O(n^n)更能解决的问题?

有许多优化问题本质上是O(n!),即在数据压缩中。这方面的常用算法都需要以这样或那样的方式进行欺骗(许多算法依赖于启发式算法),但不能确保它们通过这种方式找到了完美的结果。也就是说,在压缩PNG图像时选择最佳的是一个相对容易理解的问题


另一个例子是破坏加密的算法,它可能比O(n!)更糟糕。

您在示例中编写的代码与深度优先搜索非常相似。所以,这是一个答案

没有任何特殊特征的深度优先搜索算法(如可优化的重新收敛路径)应为n^n


这其实不是人为的例子。国际象棋程序使用相同的算法。每一个移动都有N个动作要考虑(即分支),而你搜索D移动深。因此成为O(n^d)

根据,有一些比O(nn)更复杂的双指数时间问题O(22poly(n)),例如,“决策过程”(O(22cn))和“计算a”(在最坏的情况下O(22n/10)

有一些计算(例如),其中输出大小是O(nn)时间复杂度小于O(nn)的计算有点困难。

对(终止)图灵机进行描述并返回终止所需的步数的程序。这是一个编写相对简单的程序——它可以简单地模拟图灵机,并计算步数

这个程序的复杂度没有可计算的上限(尤其是增长速度比任何可计算函数都快),因此肯定比O(n^n)增长得快


对于大小为n的输入,最坏情况下的运行时是BB(n),从0、1、4、6、13开始的序列在此之后是未知的(尽管存在下界——例如,接下来的两个值分别至少为47176870和7.412×10^36534),并且对于足够大的n是不可计算的。

生成
{1、2、…、n}的笛卡尔积
自身
n
次数计数?用n个数字枚举一个以n为基数的数字的所有值!另请参见我对密码的了解非常少,但这不是列举所有可能密钥的最愚蠢的加密破坏形式吗?这怎么比n更糟糕呢!我想通常是后者。如果n代表密钥的数量,它将ld是O(n):)这取决于你的n是什么。密钥的数量还是消息的长度?破坏加密最糟糕的情况是O(n*m),密钥和消息长度为n和m。我曾经意外地想到了一个O(n!)算法。不过,它会为一个不同的算法设置一个非常好的优化,所以这有点太糟糕了。啊,但是OP问了一些不能用比O(n^n)更好的方法解决的问题。一个问题的O(n^n)算法并不能证明这个问题不能用一个更有效的算法来解决。@Ted:到目前为止,还没有找到更有效的算法来解决国际象棋。有一些优化——比如阿尔法-贝塔剪枝——但这并没有改变国际象棋求解算法的基本特征是O(n^d)。我完全同意存在O(n^n)问题。我只是想说,证明一个问题是O(n^n)不仅仅是证明有一个O(n^n)算法可以解决它。国际象棋就是一个很好的例子,因为它是一个有限的游戏(棋盘的位置是有限的)。理论上,它具有O(1)复杂性。但是所有已知的(实用的)算法都是非常低效的。@Ted:好的,公平点。尽管OP确实以两种方式提出了这个问题(你的解释是第二种)。他/她问的第一个问题是,是否有任何不是噱头的O(n^n)算法。谢谢你,我想你的国际象棋例子是最现实的,尽管有更好的算法下棋。基于DFS的算法并不少见。量词消除是另一个这样的例子(实际上是ω(2^2^n)!)。有一些问题,这将大大受益于快速量词消除算法。
long n_to_the_power_of_m(int n, int m) {
    if(m == 0) return 1;
    long sum = 0;
    for(int i = 0; i < n; ++i)
        sum += n_to_the_power_of_m(n, m-1);
    return sum;
}