Algorithm 确定大O符号

Algorithm 确定大O符号,algorithm,big-o,Algorithm,Big O,我需要帮助理解/做大O符号。我理解它的目的,我只是不知道如何“确定给定一段代码的复杂性” 确定以下各项的大O符号 a n=6; 为了理解完整的数学定义,我推荐维基百科。简单来说,大oh是算法的上界,给定一个例程,在给定长度n的情况下,它在完成之前迭代了多少次。我们称之为上界O(n)或n的大oh 在C++中访问一个简单数组成员的代码中的p>是O(1)。无论阵列有多大,这都是一个操作 通过for循环中的数组的线性迭代是O(n) 嵌套for循环是O(n^2),如果有多个嵌套for循环,则为O(n^k)

我需要帮助理解/做大O符号。我理解它的目的,我只是不知道如何“确定给定一段代码的复杂性”

确定以下各项的大O符号

a

n=6;

为了理解完整的数学定义,我推荐维基百科。简单来说,大oh是算法的上界,给定一个例程,在给定长度n的情况下,它在完成之前迭代了多少次。我们称之为上界O(n)或n的大oh

在C++中访问一个简单数组成员的代码中的p>是O(1)。无论阵列有多大,这都是一个操作

通过for循环中的数组的线性迭代是O(n)

嵌套for循环是O(n^2),如果有多个嵌套for循环,则为O(n^k)


带分治(堆、二叉树等)的递归是O(lgn)或O(nlgn),具体取决于操作

这些例子相当简单。首先,您必须确定代码中的主要(简单)操作,并尝试将此操作的调用次数表示为输入的函数

不那么抽象:

a、 )

此代码始终在固定时间内运行。这一时间取决于计算机、I/O延迟等,但几乎不取决于
n
的值

b、 )

这一次,循环中的一段代码被执行多次。如果
n
是原来的两倍,那么迭代次数是多少

c、 )

同样,循环中也有一些代码。但这次迭代次数小于
n
。但是如果
n
足够大,您是否与b.)相似

d、 )

这段代码很有趣。第一个循环中的操作更复杂,但它需要多少恒定的时间。那么它相对于
n
执行了多少次?再次与b比较。)

第二个循环只是为了欺骗你。对于较小的
n
来说,它实际上可能比第一个需要更多的时间。然而,O(n)表示法总是考虑高
n

(五)


最后一段代码实际上非常简单。循环中的简单操作数等于
n^2
。将
1
添加到
n
中,您将得到两倍的运算量。

大O表示算法的顺序

基本事项:

  • 这种复杂性是根据条目大小来衡量的
  • 您选择一个单位操作(通常是做作或比较)
  • 您可以计算调用此操作的时间
  • 在使用复杂度时,通常会忽略常量项或常量因子,因此如果运算数为3*n^3+12,则会简化为n^3,并标记为O(n^3)
a)只运行一次,没有循环,这里的复杂性很小
O(1)

b)在循环中调用n次:
O(n)

c.)这里我们选择分析n(因为它通常是算法中的递增变量)。呼叫数为n-6,因此这是
O(n)

d)让我们假设10(n)是数组的大小,9(i)这个大小减去1。对于n的每个值,我们必须从0到n,然后从n-1到0。n*(n-1)操作,从技术上讲:
O(n*2)
,有些人将其近似为
O(n)
。两者都被称为线性时间,不同的是直线的斜率,BigO并不关心


e)循环从0到功率(2,n),即1到2^n,总结为
O(2^n)

假设您不将
cout
计算为Big-O测量的一部分

a) O(1)您可以在固定时间内执行整数赋值。
b) O(n),因为循环需要n个操作。
c) O(n-c)=O(n)常数在大O中消失。
d.1) O(2*n)=O(n)两个线性时间算法最终成为线性时间。
d.2) 如果n随pow(2,n)=2^n而增长,则操作数为O(2^n);然而,如果n是常数,它将随着O(k)增长,其中k=2^6=64,这将是线性的。
a

n=6;
cout<<n<<endl;
当n从1变为无穷大时,请注意我们在循环中的次数是如何指数增加的<代码>2->4->8->16->32->64
。如果我插入150的
n
,会发生什么?我们在循环中的次数变成了天文数字

这是指数时间:
O(2^n)
()表示一种算法,其增长率将随着输入数据集中每增加一个元素而加倍。插入一个大尺寸的n,后果自负,您需要等待数小时或数年才能完成少数输入项的计算

我们为什么在乎?

作为计算机科学家,我们对正确理解BigO符号感兴趣,因为我们希望能够以权威和信念说出这样的话:

“吉姆计算行星间距离的算法需要指数时间。如果我们要计算20个物体,这需要太多时间,他的代码是垃圾,因为我可以在线性时间内生成一个。”


更好的是,如果他们不喜欢他们听到的,你可以用数学来证明。

我不会投票结束,因为我认为这可以变成一个体面的问题,即使它被掩盖了。但是,你需要先发布你在这些问题上的尝试。告诉我们你认为答案是什么,以及为什么你认为答案是这样。当所有数据都硬编码时,它总是IMO(1)。如果有一些变量,那么O可以是不同的。还可以读一下科曼的《算法简介》,第一部分是关于O,ω和θ符号的。我真的不知道从哪里开始,我甚至没有看到我的教授复习过这些材料
n=16;
for (i=0; i<n; i++)
    cout<<i<<endl;
i=6;
n=23;
while (i<n) {
    cout<<i-6<<endl;
    i++;
}
int a[ ] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
n=10;
for (i=0; i<n; i++)
    a[i]=a[i]*2;
for (i=9; i>=0; i--)
    cout<<a[i]<<endl;
sum=0;
n=6;
k=pow(2,n);
for (i=0;i<k;i++)
    sum=sum+k;
n=6;
cout<<n<<endl;
n=16;
for (i=0; i<n; i++)
    cout<<i<<endl;
i=6;
n=23;
while (i<n) {
    cout<<i-6<<endl;
    i++;
}
int a[ ] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
n=10;
for (i=0; i<n; i++)
    a[i]=a[i]*2;
for (i=9; i>=0; i--)
    cout<<a[i]<<endl;
sum=0;
n=6;
k=pow(2,n);
for (i=0;i<k;i++)
    sum=sum+k;
n     number_of_times_in_loop
1     2^1 = 2
2     2^2 = 4
3     2^3 = 8
4     2^4 = 16
5     2^5 = 32
6     2^6 = 64