算法时间复杂度:事前预估算法时间开销T(n)与问题规模n的关系(T:Time)
void loveYou(int n) //n为问题规模
{
① int i=1;
② while(i<=n)
{
③ i++;
④ printf("I love you %d\n",i);
}
⑤ printf("I love you more than %d\n",n);
}
①---------1次
②---------n+1
③④------n
⑤---------1
T(n) = 1+n+1+2*n+1 = 3n+3 ≈ n
化简:1.只考虑高阶部分(O为同阶无穷小)
T
(
n
)
=
3
n
+
3
≈
n
=
O
(
n
)
T(n) = 3n+3 ≈ n = O(n)
T(n)=3n+3≈n=O(n)
T
(
n
)
=
n
2
+
3
n
+
1000
T(n) = n^2+3n+1000
T(n)=n2+3n+1000 ≈
n
2
n^2
n2 =
O
(
n
2
)
O(n^2)
O(n2)
T
(
n
)
=
n
3
+
3
n
2
+
99999999
T(n) = n^3+3n^2+99999999
T(n)=n3+3n2+99999999 ≈
n
3
n^3
n3 =
O
(
n
3
)
O(n^3)
O(n3)
比大小:(可用洛必达n->
∞
\infty
∞求极限)
O
(
1
)
<
O
(
l
o
g
2
n
)
<
O
(
n
)
<
O
(
n
2
)
<
O
(
n
3
)
<
O
(
2
n
)
<
O
(
n
!
)
<
O
(
n
n
)
O(1)<O(log_2n)<O(n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
O(1)<O(log2n)<O(n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)常对幂指阶
T ( n ) = n 3 + n 2 l o g 2 n = O ( n 3 ) T(n) = n^3 + n^2log_2n = O(n^3) T(n)=n3+n2log2n=O(n3)
化简:2.只考虑循环部分
化简:3.只考虑最深层循环
void loveYou(int n) //n为问题规模
{
int i=1;
while(i<=n)
{
i++;
printf("I love you %d\n",i);
for(int j=1;j<=n;j++)
{
printf("I am your boyfriend\n");
}
}
printf("I love you more than %d\n",n);
}
T ( n ) = O ( n 2 ) T(n) = O(n^2) T(n)=O(n2)
练习
void loveYou(int n)
{
int i=1;
while(i<=n)
{
i = i*2;
printf("hhhhhhhhh");
}
printf("aaaaaaaa");
}
i
=
2
,
4
,
8
,
16
,
32......
2
x
i = 2,4,8,16,32......2^x
i=2,4,8,16,32......2x
最深层循环次数为x
循环结束时满足
2
x
>
n
2^x > n
2x>n
即
x
=
l
o
g
2
n
+
1
x = log_2n+1
x=log2n+1 时
T
(
n
)
=
O
(
x
)
=
O
(
l
o
g
2
n
)
T(n) = O(x) = O(log_2n)
T(n)=O(x)=O(log2n)
//flag[] 乱序存放{1——n}
void loveYou(int n)
{
printf("aaaaaa");
for(int i=0;i<n;i++)
{
if(flag[i] == n)
{
printf("bbbbbbbbbb");
break;
}
}
}
最好情况:{
n
.
.
.
.
.
.
1
{n......1}
n......1} ————
T
(
n
)
=
O
(
1
)
T(n)=O(1)
T(n)=O(1)
最坏情况:{
1......
n
1......n
1......n} ————
T
(
n
)
=
O
(
n
)
T(n)=O(n)
T(n)=O(n)
平均情况:n出现在每个位置的概率相同为
1
n
\frac{1}{n}
n1
循环次数
x
=
(
1
+
2
+
3
+
.
.
.
+
n
)
1
n
=
1
+
n
2
x=(1+2+3+...+n)\frac{1}{n}=\frac{1+n}{2}
x=(1+2+3+...+n)n1=21+n
T
(
n
)
=
O
(
n
)
T(n)=O(n)
T(n)=O(n)
时间复杂度一般只考虑最坏、平均