数据结构和算法概述02

2021-06-08 03:02

阅读:655

标签:计算机   基本   反转   com   填充   table   指令   估算   class   

数据结构和算法概述

算法分析

  • 目的:花费更少的时间和更少的内存

 

1.1时间复杂度分析

  • 事后分析方法:

    程序开始时获取一个时间,结束时又获取一个时间,两者相减即可获得运行时间。

    例:

    public class demo {
       public static void main(String[] args) {
           long start = System.currentTimeMills();
           
           long result = fun(10);
           System.out.println(result);
           
           long end = System.currentTimeMills();
           System.out.println(end-start);
      }
    ?
       public static long fun(long n){
           int result = 1;
           for(long i = 1;i n;i++){
               result *= i;
          }
           return result;
      }
    }

弊端:必须将程序写好,跑一遍,意味着如果跑出来的结果不理想,自己花费几天时间写的这个算法时间和精力都白费了;容易受硬件影响结果。

  • 事前分析估算方法:

    程序运行所花费的时间取决于以下因素:

    • 算法采用的方案

    • 编译产生的代码质量(无法干预)

    • 问题的输入规模

    • 机器执行指令的速度(无法干预)

    再忽略算法,讨论输入量规模,随着输入量规模的增长,有以下结论:

    • 算法函数中的常数可以忽略

    • 算法函数中最高次幂的常数因子可以忽略

    • 算法函数中最高次幂越小,算法效率越高

  • 大O记法:

    • 用常数1取代运行时间中的所有加法常数

    • 在修改后的运行次数中,只保留高阶项

    • 如果最高阶项存在,且常数因子不为1,则去除与这个项相乘的常数

    常见的大O阶:

    O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)、O(n^3)、O(2^n)。

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

    先分析被调用函数的时间复杂度,再分析调用了其他函数的的函数的时间复杂度,求出总和即可。

  • 最坏情况

    最坏情况是一种保证。

  • 1.2空间复杂度分析

    • java中常见内存占用情况

      • 基本数据类型

        数据类型 内存占用情况
        byte 1
        short 2
        int 4
        long 8
        float 4
        double 8
        boolean 1
        char 2
      • 计算机访问内存都是一次一个字节(8位)

      • 一个引用(变量/机器地址)需要8个字节表示

      • 创建一个对象,除了对象内部数据要花费内存,其对象本身也要花费16字节内存来保存对象的头信息

      • 一般内存的使用不够8字节的倍数,都会被自动填充够8字节的倍数

      • 一个原始数据类型数组使用了24个字节(其中16字节用来保存数组对象的头信息,4字节用来保存长度,4字节自动填充)

    • 案例:对数组元素进行反转,并返回

      解法一:

      public static int[] reverse1(int[] arr) {
         int n = arr.lenght;   //申请4个字节
         int[] temp = new int[n]; //申请n*4个字节+数组头信息开销24个字节
         for(int i=0;in;i++){
             temp[n-1-i] = arr[i];
        }
         return temp;
      }

      忽略判断条件占用的内存,内存开销为4n+24+4即空间复杂度为O(n)。

      解法二:

      public static int[] reverse2(int[] arr) {
         int n = arr.lenght;   //申请4个字节
         int[] temp; //申请4个字节
         for(int start=0,end=n-1;startend;start++,end--){
             temp = arr[start];
             arr[start] = arr[end];
             arr[end] = temp;
        }
         return arr;
      }

      忽略判断条件占用的内存,内存开销为4+4即空间复杂度为O(1)。

    数据结构和算法概述02

    标签:计算机   基本   反转   com   填充   table   指令   估算   class   

    原文地址:https://www.cnblogs.com/flc-sept18/p/14544252.html


    评论


    亲,登录后才可以留言!