标签:精确 算法复杂度 入参 也会 错误 转换 相同 list 软件
@(数据结构算法)
==算法==:是解决特定问题求解步骤的描述,在计算机中表现为指令的优先序列,并且每条指令表示一个或多个操作。(算法是描述解决问题的方法。)
事后统计方法
==事后统计方法==:主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
该方法具有很大的缺陷:
1.必须先运行依据算法编制的程序;
2.所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的劣势。
事前分析估算方法
==事前分析估算方法==:在计算机程序编制前,依据统计方法对算法进行估算。
一个高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:
1.算法采用的策略、方法。(是算法好坏的根本)
2.编译产生的代码质量。(要有软件来支持)
3.问题的输入规模。(指输入量的多少)
4.机器执行指令的速度。(要看硬件性能)
例如以下两种算法:
int i,sum = 0,n=100; // 执行1次
for(i=1;i<=n;i++) // 执行了n+1次
{
sum = sum + i; // 执行n次
}
printf("%d",sum); // 执行1次
执行了1+(n+1)+n+1次=2n+3次
int sum = 0,n = 100; // 执行一次
sum = (1 + n) * n/2; // 执行一次
printf("%d",sum); // 执行一次
执行了1+1+1=3次
显然第二个算法更好。
测定运行时间最可靠的方法就是计算对运行时间有消耗的基本操作的执行次数。运行时间与这个计数成正比。
最终,在分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或一系列步骤。
==函数的渐进增长==:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐进快于g(n)。
一般来说,具有以下结论:
推导大O阶方法
==推导大O阶方法==:1.用常数1取代运行时间中的所有加法常数。2.在修改后的运行次数函数中,只保留最高阶项。3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 得到的结果就是就是大O阶。
常数阶
不管常数为多少,都记作O(1),
而不是O(3)、O(4)等其他任何数字。
int i;
for(i=0;i<n;i++)
{
某个时间复杂度为O(1)的步骤 // 执行了n次
}
int count = 1;
while(count < n)
{
count = count * 2;
某个时间复杂度为O(1)的步骤
}
分析:由于每次count * 2 之后,就距离n更近,也就是说,x 个2相乘后就会大于 n 并退出循环。由2^x^=n 得 x=log2(n)。所以以上代码的时间复杂度为O(log(n))。
int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
时间复杂度为O(1)的步骤
}
}
总的执行次数为n+(n-1)+(n-2)+…+2+1=(n^2^/2)+(n/2) ,可得该段代码的时间复杂度为O(n^2^)。
一般来说:
O(1)<O(log(n))<O(n)<O(nlog(n))<O(n^2^)<O(n^3^)<O(2^n^)<O(n!)<O(n^n^)
==最坏情况==是一种保证,指运行时间不会再坏了。再应用中,这是一种最重要的需求,除非特别指定,否则我们提到的运行时间都是最坏情况的运行时间。
==平均运行时间==是所有情况中最有意义的,因为它是期望的运行时间。
==空间复杂度==通过计算算法所需的存储空间实现,计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
标签:精确 算法复杂度 入参 也会 错误 转换 相同 list 软件
原文地址:https://www.cnblogs.com/PursuingtheLight/p/11359721.html