首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >准确的大O分析

准确的大O分析
EN

Stack Overflow用户
提问于 2014-04-03 04:48:41
回答 2查看 1.3K关注 0票数 0

假设您需要生成第一个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-1填充数组A,如下所示:若要填充Ai,请生成随机数,直到得到A、A1、…中尚未包含的数组。,Ai-1.

(ii)与演算法(i)相同,但保留一个称为使用阵列的额外阵列。当随机数Ran第一次放入数组A中时,设置UsedRan = true。这意味着当使用随机数填充Ai时,可以一步进行测试,以确定是否使用了随机数,而不是第一个算法中的(可能)i步骤。

(iii)填充数组,使Ai = i+1。

代码语言:javascript
运行
复制
for (i=1; i<n; i++)
swap (A[i], A[RandInt(0,i)]);

尽可能准确地(大O)分析每种算法的预期运行时间。

有人能帮忙吗?因为我只是学了这一章,不太明白这个问题想要什么..

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 04:57:43

I:你必须填满N个插槽,但是当你不断地填充时,你不太可能得到一个有效的数字。如果您已经填充了M个槽,那么获得一个有效数字的机会是1-(M/N)。此外,随着列表变得更长,您需要对整个过程进行迭代。N个数字* O(N)猜测每一个时隙* O(N)检查数是否已经包含= O(N^3) (O(N) )检查每个数字,因为最坏的情况是最后一个数,1/N得到未使用的数的机会)

现在我们不需要对每个检查迭代整个数组,所以只有O(N^2)

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

我想我把这些都做对了,但我很容易就错过了一些东西。希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2014-04-03 04:55:18

选项4:用从1到n的值填充List / Collection,然后对集合进行洗牌。O(n) + ~O(n) => O(n)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22828094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档