算法与数据结构(一)

第一章 算法和数据结构概述

1.1 数据结构

数据结构,直白地理解,就是研究数据的组织方式和存储方式。 数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好的方式来存储数据,而这也是数据结构的核心内容。

数据存储的目的是为了更好的使用 ,存储之间具有复杂关系的数据,需要特殊的结构存储,方便读取使用; 

数据结构是一门学科,它教会我们“如何存储具有复杂关系的数据更有助于后期对数据的再利用”。

按照逻辑结构

1. 包结构 :  数据元素之间无关系

  

2. 线性结构 : 数据元素之间是一对一关系

    

3. 树形结构 :  数据元素之间是1对多关系

    

4. 图形结构 : 数据元素之间是多对多关系

    

 

按照存储结构

1. 顺序存储结构 : 存储数据的元素地址是连续的,可以通过索引获取数据 :  查找方便, 插入和删除性能不好

2. 链式存储结构 : 存储数据的元素地址不是连续的, 但是数据本身有一个索引指向下一个地址,  查找不方便, 插入和删除性能好.

     

1.2 算法

算法 : 用已知方法,通过编写程序解决问题.

优秀的算法: 

1. 时间维度, 用最少时间完成计算

2. 空间维度, 用最小内存完成计算

  需求 :  1+2+3+..+ 100  

    /**
     * 算法1
     */
    private static int cal(int n) {
        int sum = 0;
        for (int j = 1; j <= n; j++) {
            sum +=j;
        }
        return sum;
    }

    /**
     * 算法2
     */
    private static int cal2(int n) {
        return (1+n)*n/2;
    }

比较 :  算法1计算n次得出结果,  算法2计算1次得出结果, 如果n是持续增大, 算法1消耗时间肯定增加, 算法2 基本没什么变化永远一次计算得出结果; 这就是算法的好处; 

1.2.1  算法分析

时间复杂度分析 

事后分析 :  观察法和实验室,直接比较两算法的执行时间, 得出那种算法更优

事前分析 :

  1. 算法采用的策略,  (需要考虑的)
  2. 编译代码的质量  (没办法考虑)
  3. 问题输入规格 (需要考虑)
  4. 机器指令的执行速速 (没办法考虑)

算法分析一般需要考虑采用的策略和输入的规格, 输入的数据量的大小,应该采用不同策略;

时间复杂度分析法 :

1. 输入规模n的增加, 判断执行次数的多少, 可以类比执行需要的时间

2.  分析代码 .去除变量定义的次数, 去除循环判断的次数,   只分析核心计算代码

函数的渐近增长

 对于两个函数f(n)和g(n), 随着n的增长,存在一个点N, n>N的情况, f(n) > g(n)  , 说明f(n)的渐进增长快于g(n) 

比较 1: 下面几个算法

nA1(2n+3)A2(2n)B1(3n+1)B2(3n)
15243
27476
396109
819162524
921182827
1023203130
100203200301300

比较分析 :  当n>2时候, B1的渐近增长大于A1,

随着n的不算增大, A1和A2, 基本没什么差别,   B1和B2也没什么差别,所以说常数影响不大

比较下面算法

nA1(4n+8)A2(n)B1(2n^2+1)

B2(n^2)

112131
216294
3203199
840812964
944916381
104810201100
1004081002000110000
2008082008000140000
300120830018000190000
4001608400320001160000
5002008500500001250000
6002408600720001360000
7002808700980001490000
80032088001280001640000
90036089001620001810000
10004008100020000011000000
15006008150045000012250000
20008008200080000014000000

                              

 

比较 : B1和B2是平方增长, 算法明显大于A1和A2, 随着n的不断增大, B1和B2算法的差别也不会特别明显, 也就是说最高系数的常数影响在不断减小.

比较下面算法

算法A1 : 2n^2+3n+1

算法A2 : n^2

算法B1: 2n^3+3n+1

算法B2: n^3

实际的计算就不写了, 肯定3次方的渐进增长最大的,  B1和B2比较, 也差别不大,  结论,低次幂的影响很小.主要是是高次幂影响

比较下面算法

算法1 : n^3

算法2: n^2

算法3: n

算法4: logN

算法5: 1 

结论:  算法中最高次幂决定复杂复

1.2.2大O记法表示时间复杂度

时间度量 T(n) = O(f(n))

f(n) 表示执行次数

表示原则 :

  1. 常数忽略,只有常数转换为1
  2. 最高次幂常数因子忽略
  3. 只保留高阶

实例 : 

算法A1 : 2n^2+3n+1     大O标记  O(n^2)

算法A2 : n^2             大O标记  O(n^2)

算法B1: 2n^3+3n+1   大O标记  O(n^3)

算法B2: n^3       大O标记  O(n^3)

常见大O阶

1.  线性阶O(n)   累加求和, 也就是for循环1一次 

2. 平方阶O(n^2)  两次for循环嵌套, 冒泡排序  

3. 立方阶O(n^3)  三层for循环

4.对数阶O(logn)  二分查找

5.常数阶O(1)  高斯公式计算求和

复杂度从低-高

O(1) < O(logn) < O(n) < O(nlogn) <  O(n^2) < O(n^3) 

复杂度分析 :  需要从最坏情况分析,比如排序,完全逆序排序,

空间复杂度分析 

空间复杂度分析,需要分析,算法每次计算占用多少内存, n增加 需要的内存是不是巨量增大, 目前算法主要是考虑时间复杂度, 空间复杂度,需要在特别消耗内存的算法中考虑. 一般的算法不是特别消耗内存. 

 

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值