algorithm - 我被时间复杂度困住了
问题描述
我正在研究算法的时间复杂度,但我遇到了一些问题。你能帮我找出下面代码的时间复杂度吗?谢谢。
x=1;
for(i=0; i<=n-1; i++){
for(int j=1; j<=x; j++)
std::cout<<j<< std::endl;
x =x*2;
}
解决方案
以下是我的思考过程的演练:
- 第一个 for 循环运行
n
时间,因此时间复杂度为O(n)。 - 随着第一个 for 循环的进行,第二个 for 循环的循环次数增加了两倍,因此时间复杂度为O(2^n)。
- 将两者结合起来,看起来代码的时间复杂度为O(n*2^n)。
- 但是,你想得更深一点,这是不正确的。
- 如果考虑第二个 for 循环运行的循环数,则为 1、2、4、8、...、2^(n-2)、2^(n-1)。
- 因此,循环的总数将是 2^(n-1) + 2^(n-2) + ... + 2^1 + 2^0。
- 对于任何给定的 x,x + x/2 + x/4 + ... + 2 + 1 = 2*x - k(其中 k 的值取决于)。
- 应用相同的概念,循环的总数为 2*2^(n-1)。
- 结果,整体时间复杂度为O(2^n)。
推荐阅读
- javascript - 如何删除里面的“自动添加的跨度”
- r - 列中 R 中的时间序列
- r - 如何在操作系统 UBUNTU 上的 R 中安装“quantmod”包?
- javascript - 当用户根据输入和给定的密码登录时,如何检查输入是用户名还是电子邮件?
- python - 熊猫连接多个数据帧,其中每个数据帧/表都有其单独的索引
- vue.js - 将所有数据存储在vuex或redux中好吗?
- r - 如何根据读数数量排除 R 中的患者?
- arrays - 程序在C中向字符串添加随机字符
- c# - 解析来自 c# 的参数的 oracle 查询
- python-3.x - 如何使用带有 python 的 API 连接到站点?