2019-05-29【数据结构】绪论及算法复杂度

--------------------------------
Author : ShawnDong
updateDate :2019.5.31
Blog : ShawnDong98.github.io
--------------------------------

绪论

程序 = 数据结构 + 算法

物理结构:顺序存储结构和链式存储结构

逻辑结构:线性结构(顺序表、链表)和非线性结构(树、图)

算法的特性: 输入、输出、有穷性、确定性、可行性
算法设计的要求:正确性、可读性、健壮性、时间效率高和存储量低

时间复杂度和空间复杂度

时间复杂度

推导大O阶方法

  • 用常数1取代运行时间中所有的加法常数
  • 修改后的运行次数函数中,只保留最高项
  • 如果最高项存在且不是1,则去除与这个项相乘的常数
  • 得到最后的结果就是大O阶

线性阶
一般含有非嵌套循环涉及线性阶,线性阶就是随着问题规模n的扩大,对应计算次数呈直线增长

int i, n = 100, sum = 0;
for(i=0; i

平方阶

int i, j, n = 100, sum = 0;
for(i=0; i
int i, j, n = 100, sum = 0;
for(i=0; i

由于当i=0时,内循环执行了n次,当i=1时,内循环执行了n-1次...当i=n-1时,内循环执行1次,所以总的执行次数应该是:
用推导大O的攻略,第一条忽略,因为没有常数相加。第二条只保留最高项,所以n/2这项去掉。第三条,去除与最高项相乘的常数,最终得到

对数阶

int i = 1, n = 100;
while(i
  • 由于每次i*2之后,就举例n更近一步,假设有x个2相乘后大于或等于n,则会退出循环。
  • 于是由得到, 所以这个循环的时间复杂度为

函数调用的时间复杂度分析

void function(int count){
  printf("%d", count);
}

int main(){
  int n=0, i=0, j=0;
  n++; //1
  function(n); //n
  for(i=0; i

常见的时间复杂度

常见的时间复杂度

常用的时间复杂度所耗费的时间从小到大依次是:

你可能感兴趣的:(2019-05-29【数据结构】绪论及算法复杂度)