【问题标题】:Time Complexity for C Program Which uses Random Numbers使用随机数的 C 程序的时间复杂度
【发布时间】:2013-09-10 14:08:45
【问题描述】:

我不知道是否有人问过这个问题,但请考虑以下程序。

疑问 1

我可以计算一个近似值吗?这个程序的复杂性? (最差/最好/平均)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(NULL));
    int no;
    while((no=rand()))
    printf("Hello world!\n");
    return 0;
}

this 问题中,OP 计算了使用随机数的问题的复杂性,但我不知道如何进行此计算。

在 Java 中随机生成。无论种子如何,都需要 O(1)。

这个程序是否具有恒定的时间复杂度(因为它不依赖于任何其他因素/输入)?

疑问2

int main()
    {
        while(1){
           //some action
        }
        return 0;
    }

这个问题的复杂性?

无限循环是否使问题具有确定性?

【问题讨论】:

  • 这个程序没有输入。那么这怎么会有时间复杂度数字呢?另一个把握:时间复杂度适用于确定性算法。当然,在大多数情况下,简单随机并不是那么随机,但话又说回来:如果迭代依赖于(伪)随机值,我不会称其为确定性。
  • @ppeterka66 我应该保留这个问题吗?还是删除?
  • 根本没有输入。可以估计函数 rand() 的复杂性,但不能估计程序本身的复杂性,因为它的持续时间取决于随机种子。
  • 其实不知道要不要关闭。有人会从阅读本文中受益吗?或者如果需要这些信息,甚至可以找到它?坦率地说,我对 this 问题不知所措......
  • @ppeterka66:随机算法的时间复杂度与确定性算法同样重要。

标签: c time-complexity


【解决方案1】:

这取决于rand的实现。只有当它以这样一种方式实现时,每个UINT_MAX 可能的随机种子(或至少time 的所有可能的返回值)在某个时候都达到零,才可以定义最坏情况的时间复杂度。否则,它是未定义的,因为这不是一个算法,而充其量是一个半算法:它不能保证终止。

那么,我认为实际复杂性只能通过考虑一系列机器来确定,sizeof(time_t) 越来越大,因为time 是程序中唯一需要任何输入的部分。它是 O(2^n),其中 n 是机器的字长,因为随机种子的数量不能超过该数量。

在任何一台机器上,最坏情况下的运行时间由某个常数(可能非常大)限定,假设 rand 最终会为每个种子达到零,使其变得微不足道 O(1) .

【讨论】:

  • 您对这个程序没有任何输入这一事实有何看法?我认为在这种情况下,复杂性没有意义。如果您不同意,您会详细说明吗?
  • 编辑问题以使人们的答案不再匹配是一个非常糟糕的主意。
  • @boxed__l:永远不要在旧问题之下提出新问题。它打败了 SO 的常见问题性质。要回答这个问题,该程序没有复杂性,因为它没有实现算法。
  • @boxed__l:没关系。根据定义,永不终止的程序不是算法。
  • @boxed__l:问一个新问题是要走的路,尤其是。在您已经接受答案之后。我的回答不再反映你的问题,这有点可惜。
猜你喜欢
  • 2020-11-23
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2018-01-28
  • 2013-03-13
相关资源
最近更新 更多