算法系列(一):算法及数据结构介绍

163 阅读2分钟

算法概述

  • 什么是算法?
    • 算法定义:本质是一系列程序指令,用于解决特定的运算和逻辑问题
  • 算法的特点
    • 算法有简单的,也有复杂的
    • 算法有高效的,也有拙劣的
  • 衡量算法标准
    • 时间复杂度
      • 定义:
        • 若存在函数f(n) ,使得当n趋近于无穷大时,T(n)/f(n)  的极限值为不等于零的常数,则称 f(n)  是 T(n)  的同数量级函数。
        • 记作 T(n)=O(f(n)) ,称为O(f(n))O为算法的渐进时间复杂度
        • 别称:大O表示法
      • 时间复杂度的原则
        • 如果运行时间是常数量级,则用常数1表示
        • 只保留时间函数中的最高阶项
        • 如果最高阶项存在,则省去最高项前面的系数
      • 时间复杂度的场景(O(1) < O(lognlogn) < O(n)< O(n2)
        • O(n) T(n) = 3n,最高阶项为3n,省去系数3,则转为T(n)=O(n)
        • O(lognlog n) T(n) = 5lognlogn,最高阶项为5lognlogn,省去系数5,则转为T(n)=O(lognlogn)
        • O(n2)
        • O(1)
    • 空间复杂度
      • 空间复杂度定义
        • space complexity:对一个算法在运行过程中临时占用存储空间大小的量度
        • 使用大O表示法
        • S(n)=O(f(n))n为问题的规模,f(n)  为算法所占存储空间的函数
      • 空间复杂度情形
        • 常量空间 算法的存储空间大小固定,和输入规模没有直接的关系
        public void func(int n) { 
            int a = 100;
        }
        
        • 线性空间 - 算法分配的空间是一个线性的集合(如数组),并且集合大小和输入规模n成正比时
        public void func(int n) { 
            int[] arr = new int[n];
            //todo
        }
        
        • 二维空间 算法分配的空间是一个二维数组集合,并且集合的长度和宽度都与输入规模n成正比时
        public void func(int n) {
            int[][] arr = new int[n][n]; 
            //todo
        }
        
        • 递归空间 递归会专门分配一块内存,存储方法调用栈
          • 方法调用栈
          • 进栈:当进入一个新方法时,执行入栈操作,把调用的方法和参数信息压入栈中
          • 出栈:当方法返回时,执行出栈操作,把调用的方法和参数信息中栈中弹出
        public void func(int n) {
            if(n == 0) {
                return;
            }
            func(n - 1);
        }
        
  • 什么是数据结构
    • 数据结构定义:是数据的组织、管理和存储格式,其使用目的是为了高效地访问和修改数据
    • 数据结构的分类
      • 线性结构
        • 数组
        • 链表
        • 队列
      • 其他结构
        • 跳表
        • 哈希链表
        • 位图