当前位置: 首页 > 知识库问答 >
问题:

很难找出这些棘手的大O的例子

王弘和
2023-03-14

我正在为即将到来的关于大O符号的测验学习。我这里有几个例子,但它们给我带来了麻烦。对于你在网上找到的许多基本例子来说,它们似乎有点太高级了。以下是我遇到的问题。

1.     `for (i = 1; i <= n/2; i = i * 2) {
            sum = sum + product;
            for (j= 1; j < i*i*i; j = j + 2) {
                sum++;
                product += sum;
            }
       }`

对于这一个,外部循环中的i=i*2意味着O(log(n)),我认为i

2.      `for (i = n; i >= 1; i = i /2) {
             sum = sum + product
             for (j = 1; j < i*i; j = j + 2) {
                 sum ++;
                     for (k = 1 ; k < i*i*j; k++)
                     product *= i * j;
             }
        }`

对于这个循环,最外层的循环意味着O(log(n))。中间的循环意味着,同样不确定的是,O(i^2)?最里面的循环意味着O(i^2*j)?我以前从未见过这样的例子,所以现在我几乎是在猜测。这个问题的大O符号是O(i^4*n*j)吗?

3.     `for (i = 1; i < n*n; i = i*2) {
            for (j = 0; j < i*i; j++) { 
                sum ++;
                for (k = i*j; k > 0; k = k - 2)
                    product *= i * j;
            }
       }`

这个循环的最外层有一个n^2条件,但也有一个对数增量,所以我认为这正好是正则O(n)。中间的循环是O(i^2),最里面的循环是O(n)并试图欺骗你。所以对于这个问题,大O符号应该是O(n^2*i^2)?

4.     `int i = 1, j = 2;
            while (i <= n) {
                sum += 1;
                i = i * j;
                j = j * 2;
       }`

For this one I did a few iterations to better see what was happening:
i = 1,    j = 2
i = 2,    j = 4
i = 8,    j = 8
i = 64,   j = 16
i = 1024, j = 32 

很明显,“我”成长得很快,所以这个条件很快就满足了。然而,我不确定这是什么样的大O符号。

非常感谢你能给的任何提示或提示,谢谢伙计们。


共有1个答案

汪皓
2023-03-14

不能将i或j添加到O表示法中,必须将其转换为n。

对于第一个:

设k为log2i。

然后,对于外循环的每次迭代,内循环执行2^(k*3)/2=2^(3k-1)次。

k从1到log2n。所以总迭代次数是2^(3k-1)的总和,对于k从1到log 2n,根据Wolfram Alpha是4/7(n^3-1),也就是O(n^3)。

对于最后一个,i=j1*j2*j3*。。。jk,jm=2^m

i=2^1*2^2*。。。2^k=2^(12…k)

所以1 2 3... k=log 2 n

(k1)k/2=log2n

哪个是O(sqrt(logn))

顺便说一句,log n^2不是n。这个问题在计算机科学上比在这里问更好。

 类似资料:
  • 也许我的证书理解中缺少了什么。CA不应该发布他们的根CA吗?也就是说,他们不是应该高喊“这是我的根,来抓他们吧。”为什么我这么难找到这个根证书?

  • 问题内容: 我创建了一个新文件。所谓 然后在那里我做: 我想在另一个class()中使用它, 很好,但是当我深入研究错误时。 问题答案: 您不能只是拥有一个init。该变量必须在类顶层声明。 使用单例的示例: 当需要在另一个类中使用单例时,只需在另一个类中执行此操作: 按照Martin R和Caleb的评论进行更新: 我已将初始化程序设为私有。它在其他Swift文件中阻止的初始化,从而只能通过使用

  • Netty中是否有任何嵌入式优先级机制可以帮助我决定哪些消息比其他消息发送得更频繁?

  • 下面的代码仅在观察2完成后才从观察1发出项。 我需要实现另一种行为 第二个可观测对象仅发射项目,而第一个可观测对象为空,然后发射第一个可观测对象的项目。 我无法找到只使用基本运算符的正确解决方案,自定义运算符startWithDefault的正确RxJava 2实现应该是什么样子? 附笔。 由于种族原因,在可观察到立即发射的情况下,这不是正确的解决方案1

  • 问题内容: 有一段时间遇到这个麻烦。 我有这样的数据库: 我要执行搜索,找到最便宜的汽车,然后按价格升序订购其余相同品牌的汽车。 我希望我的输出是这样的: 最便宜的汽车是福特嘉年华(Forest Fiesta),因此,其余福特车型都按照价格直接订购。然后,本田拥有第二便宜的车型,因此爵士车和其他本田车紧随其后,依此类推。 这可能吗? 问题答案: 您需要做的是创建一个瞬态数据集,该数据集包含car_

  • 有一段时间想弄明白,但运气不好。我有以下表格(MS-SQL 2008):学生ID–电子邮件–档案ID 课程 courseID–名称 学生资源 学生ID–课程ID 配置文件 课程设置 学生学习日志 logID-studentID-courseID-accessDate 每个学生在注册时,都会被分配一个个人资料。对于每个配置文件都有一些必修课程。这些必修课程以及用户参加的任何其他课程都保存在学生课程表