• 邓俊辉数据结构学习0绪论


    邓俊辉数据结构学习笔记

    绪论

    知识储备

    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)因此需要重新设置递归基。

  • 相关阅读:
    jdk jre jvm 关系
    深入Android开发之--理解View#onTouchEvent
    使用android.view.TouchDelegate扩大View的触摸点击区域
    Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习
    BitMap 内存使用优化
    android——屏幕适配大全(转载)
    android——ImageLoader添加缓存
    android——混淆打包
    android——仿微拍贷滑动圆形菜单
    android——使用自带录屏工具进行屏幕录像
  • 原文地址:https://www.cnblogs.com/patientcat/p/9720259.html
Copyright © 2020-2023  润新知