【问题标题】:Accurate Big-O analysis准确的大 O 分析
【发布时间】:2014-05-14 17:14:47
【问题描述】:

假设您需要生成前 N 个整数的随机排列。例如,{4, 3, 1, 5, 2} 和​​ {3, 1, 4, 2, 5} 是合法排列,但 {5, 4, 1, 2, 1} 不是,因为一个数 (1) 重复,而另一个 (3) 缺失。该程序常用于模拟 算法。我们假设存在随机数生成器 RandInt(i,j),即 在 i 和 j 之间以相等的概率生成。以下是三种算法:

(i) 将数组 A 从 A[0] 填充到 A[N-1] 如下: 要填充 A[i],生成随机数 直到你得到一个不在 A[0]、A[1]、...、A[i-1] 中的数字。

(ii) 与算法 (i) 相同,但保留一个称为 Used 数组的额外数组。当一个随机 数字 Ran 首先放入数组 A 中,设置 Used[Ran] = true。这意味着 用随机数填充 A[i] 时,可以一步测试,看是否 已使用随机数,而不是第一个算法中的(可能)i 步。

(iii) 填充数组使得 A[i] = i+1。那么

for (i=1; i<n; i++)
swap (A[i], A[RandInt(0,i)]);

尽可能准确 (Big-O) 分析每个算法的预期运行时间。

有人可以帮忙吗?因为我只是学习这一章,并不太明白问题想要什么..

【问题讨论】:

    标签: arrays random operating-system big-o


    【解决方案1】:

    我: 您必须填写 N 个插槽,但随着您不断填写,您获得有效数字的可能性较小。 如果您已填满 M 个插槽,则获得有效数字的机会为 1-(M/N)。此外,随着列表变长,您需要遍历整个事物。 N 个数字 * 每个槽的 O(N) 次猜测 * O(N) 检查是否已经包含数字 = O(N^3) (O(N) 检查每个号码,因为最坏的情况是最后一个号码,有 1/N 机会获得未使用的号码)

    II:现在我们不必为每次检查遍历整个数组,所以只需 O(N^2)

    III:交换需要恒定的时间,我们遍历整个数组一次,所以 O(N)

    我认为我做对了所有这些,但我很容易错过了一些东西。 希望这会有所帮助。

    【讨论】:

    • 所以第 1 部分的大 O 是 O(N^3)?
    • 这是我从别人那里得到的。第二种算法为每个随机数保存 i 因子,因此平均减少了 O(N log N) 的时间限制。你怎么看?
    • 你需要 N 个数字,每个数字最多取 N 次猜测的平均值,这对我来说似乎是 O(N^2)。首先是 O(N^3)
    【解决方案2】:

    选项 4:用从 1 到 n 的值填充列表/集合,然后对集合进行洗牌。 O(n) + ~O(n) =&gt; O(n)

    【讨论】:

    • 这不是和他的第三个选项本质上一样吗?你会如何以不同的方式洗牌?
    • 是的..当他发布时我仍在发布我的答案(我猜..):)
    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多