数据结构与算法

91 阅读2分钟

算法定义

算法就是解决特定问题求解步骤的描述, 在计算机中表现为指令的有限序列, 并且每个指令表示一个或多个操作.

算法特性

  • 输入输出

  • 有穷性

  • 确定性

  • 可行性

算法设计要求

  • 正确性

  • 可读性

  • 健壮性

  • 时间效率高和存储量低

时间复杂度规则 - 大O表示法

  • 用常数1取代运行时间中所有常数 3->1.  O(1)

  • 在修改运行次数函数中, 只保留最高阶项 n^3+2n^2+5 -> O(n^3)

  • 如果在最高阶存在且不等于1, 则去除这个项目相乘的常数 2n^3 ->  O(n^3)

时间复杂度术语

  • 常数阶  O(1)

void sum1(int n) {

       int sum = 0;

       sum = (1+n)*n/2;

       printf("%d\n", sum);

}

  • 线性阶 O(n)

void add (int x, int n) {

      for (int i = 0; i < n; i++) {

            x += 1;

      }

}

  • 平方阶 O(n^2)

void test(int n) {

      int sum = 0;

      for (int i = 0; i < n; i++) {

            for (int j = i; j < n; j++) { sum += j; }

      }

}

  • 对数阶 x = log2n  ->  O(logn)

void test (int n) {

      int count = 1;

      while (count < n) { count = count * 2 }

}

  • 立方阶 O(n^3) : 3层for循环

  • nlog阶

  • 指数阶(不考虑) O(2^n)或者O(n!) 除非是非常小的n,否则会造成巨大的时间消耗.

空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现, 算法空间复杂度的计算公式记做 : S(n) = n(f(n)), 其中, n为问题的规模, f(n)为语句关于n所占存储空间的函数.

在考量算法的空间复杂度的时候, 主要考虑算法执行时所需要的辅助空间.

例如 

问题: 将一个数组逆序排列存放在原数组中 

int n = 10;

int a[10] = {1,2,3,4,5,6,7,8,9,10};

算法一 : O(1)

int temp;

for (int i = 0; i < n/2; i++) {

      temp = a[i];

      a[i] = a[n-1-i];

      a[n-i-1] = temp;

}

算法二 : O(n)

int b[10] = {0};

for (int i = 0; i < n; i++) {

      b[i] = a[n-1-i];

}

for (int i = 0; i < n; i++) { a[i] = b[i] }