邓俊辉数据结构学习笔记

绪论

知识储备

  1. 离散数学基础
  2. 概率基础

如何评价一个算法

渐进分析:大O记号

问题:随着规模的增长,计算成本如何增长?

这里关系的是足够大的问题。

即当 n >> 2的时候

需执行的基本操作次数:T(n) = ?

需占用的存储单元数:S(n) = ? // 有时候,不考虑,为什么? 目前还不明白

估算能力大成: 像呼吸一样估算。

算法分析的俩个任务

  1. 正确性
  2. 复杂度

复杂度分析方法

迭代:级数求和

递归:递归跟踪 + 递推方程

猜测 + 验证

如何进行算法复杂度分析

一般采用时间复杂度T(n)的方式来评价一个算法,且一般为平均和最坏???

迭代和递归

所谓迭代,就是for循环里套for循环的意思。

递归的本质就是自身调用

迭代乃人工,递归方神通。

辩证看待:

迭代效率往往在效率上高于递归。所以在一开始需要将迭代转递归,然后学习一段时间后
再递归转迭代。

分治。思想:将大问题转换为小问题。

tips

算法复杂度, 一般指的是时间复杂度。

空间复杂度有两种说法,倾向于这种: 我们一般不考虑输入所占用的空间,仅仅是考虑在算法本身中
借用的空间。

example

int sumI(int a[] , int n)
{
    int sum = 0;
    for(int i = 0; i<n ; ++i)
    {
        sum += a[i];
    }
    return sum;
}

我们将n看做这个问题的规模,每当我们执行完for循环中的一次op时,规模就会减1。
这种不断蚕食的方法就是动态规划

动态规划

问题: 动态规划和递归的区别?

动态规划就是讲一个问题使用递归找出算法的本质,然后将其转化为迭代的形式。

前半部分就是make it work, make it right. 后半部分就是 make it fast。

总结精华

  1. 对于我来说,仔细研究算法的复杂度没有任何意义。计算也不是我需要做的事情。我要明白的是算法
    复杂度之间的比较。
    1. 可以参照算法复杂度的图进行比较。
    2. O(1) > O(log N) > O( n.exp(c)) 前面都是可以接受的,一旦算法的复杂度达到指数级别。就是不可以接受和使用的
    3. 扩展问题,这是一个在算法竞赛中np问题和npc问题的区别。
  2. 常见的俩种分析问题策略
    1. 减而治之
      • 核心思想是将n规模的问题分解为 n-1 规模的问题和 一个平凡问题(即常识时间可解问题)。
    2. 分而治之
      • 核心思想是将n规模的问题划分为多个子规模问题。采取多路递归的方式进行问题的求解。
  3. 递归的一些基础概念
    1. 递归基
    2. 多向递归和多路递归的区别
    3. 什么是尾递归, 尾递归如何转为迭代

Tips
很重要的一个tips,对于任何形式的数组问题,我们喜欢使用左闭右开的方式进行处理
即假设数组的大小是n,左边第一个元素是0,末尾原始是n-1,我们喜欢将n虚拟出来。即
可以当做哨兵。在进行逻辑思考时,也很方便。
另一种数组的使用方式是low和hi的标志方式,同样为左闭右开的方式,hi仅仅当做监视
哨。但是在实际逻辑思考的时候,带来诸多方便。后续补充。
主要明白为什么采用这个算法,和这个算法的优点。而不是去在数学原理上探究这个算法
为什么这样做。

一个值得讨论的例子

在做数组求和的时候,往往high是真实的最高位,即左闭右闭的区间。原因是递归基的最后判断
条件是low == high 自然要求high真实存在。

如果采用左闭右开的区间的话,就[0, 1)区间的划分,将会是无限递归的,因为其始终可以划分为[0,0]
和[0, 1)因此需要重新设置递归基。

 posted on 2018-09-28 18:50  patientcat  阅读(462)  评论(0编辑  收藏  举报