day001:数据结构和算法-时间频度和时间复杂度

1、初识数据结构和算法

简单认识中:ArrayList的查询快点,插入慢。LinkedList查询慢,插入快。但是结论是将数据的大小为基础前提,相对的。
-1^n 计算问题
编程问题:求(-1)^0 + (-1)^1+ (-1)^2…+ (-1)^n
思路一:循环遍历sum
思路二:当n为奇数sum=-1,当n为偶数时候sum=0
编程问题:求1+2+3…+100
思路一:循环遍历sum
思路二:(n+1)* n/2

数据结构

研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系

2、基本概念

算法

算法代码着用系统的方法描述解决问题的策略机制。
同时出来一个问题,选择什么算法解决,就会###涉及时间复杂度和空间复杂度。

度量算法的执行时间

度量是一个程序(算法)执行时间的两种方法
1)事后统计法
2)事前估算法

时间复杂度统计属于事前估算方法

3、时间复杂度和空间复杂度

时间频度T(N)

一个算法中的语句执行次数称为语句频度或者时间频度,记T(n),n我理解为问题的一个规模

时间复杂度O(n)

1) 某一个函数f(n):当n趋于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称发f(n)是T(n)的同数量函数,记作T(n)=O(f(n))。我理解为:时间频度和时间复杂度可以相同理解,就是一个规模。
2) 时间复杂度分:最坏得时间复杂度、平均时间复杂度
我们一般都是做最坏的时间复杂度。

空间复杂度

1)一个算法的空间复杂度定义为该算法所耗费的存储空间,它是问题规模n的函数。
比较明细的架势redis用空间换时间,但是我们一般都在意时间复杂度上。

例子

    // 算法一 时间频度T(n) = n+1
    int sum =0;
    int end =100;
    for (int i = 0; i <= end ; i++) {
     sum+=i;
     
    }
    // 算法二 时间频度T(n) = 1
    sum+=(1+end)*end*2;

计算时间复杂度

忽略常量项
day001:数据结构和算法-时间频度和时间复杂度_第1张图片
结论:2n+20 和 2n ,n变大会无限接近
3n和3n+10 ,n变大会无限接近
同理,忽略低次项和忽略系数也是这样。
结论是:
1)用常数1代替运行时间中的所有加法常量
2)修改后的运行次数函数中,只保留高阶项
3)去除最高阶项的系数 T(n)=n^2
=>O(n^2)
常见的时间复杂度:
常数阶O(1)、对数阶O(logn)、线性阶O(n)、k次方阶O(n^k)、 O(2^n)
常数阶O(1): 按照上面的例子来看,只要不循环,那这个代码的时间复杂度就是O(1)
线性阶O(n):按照上面的例子来看,都多少个n。就要循环n次,那这个时间复杂度就是O(n);

4、复杂度分析

时间复杂度

原则:忽略常数项、忽略低次项、忽略系数
由小到大:O(1)k)n)
添加元素的时间复杂度:
1)拿list 添加值做比较
从最后加addLast(e) 复杂度O(1)
从头加addFrist(e) 复杂度O(n)
指定位置加add(index,e) 复杂度O(n)
总结:list add方法是O(n) 级别
2)删除
总结:list delete 方法是O(n) 级别
3)修改
总结:list update 方法是O(1) 级别
3)查找
总结:list select 有索引 方法是O(1) 级别、没有索引就是O(n)

均摊时间复杂度

总结就是上面的都是用最坏得时间复杂度,正常可以平均一下。

复杂度动荡

List 再扩容时候,如果在边际进行编辑和删除导致的的长度的回收和扩容,就是动荡;
解决方式,是当长度是小于1/4 的时候才回收。

你可能感兴趣的:(数据结构,算法,面试)