zoukankan      html  css  js  c++  java
  • 13、《算法图解》总结

    第一章-大O表示法

    1、一些常见的大O运行时间

    (1)O(n),线性时间,如简单查找;

    (2)O(log n),对数时间,如二分查找;

    (3)O(n2),如简单排序;

    (4)O(n×log n),如快速排序;

    (5)O(n!),如旅行商问题。

    2、大O表示法的特点

    (1)算法的速度比较不是时间,而是操作数的增速;

    (2)谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加;

    (3)算法的运行时间用大O表示法表示;

    (4)O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。

    3、大O表示法小结

    (1)二分查找的速度比简单查找的速度快得多;

    (2)O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多;

    (3)算法运行时间不以秒作为单位;

    (4)算法运行时间是从其增速的角度度量的;

    (5)算法运行时间用大O表示法表示。

    第二章-选择排序

    (1)计算机内存就像一大堆抽屉;

    (2)需要储存多个元素时,可使用数组或者链表;

    (3)数组的元素都在一起;

    (4)链表的元素是分开的,其中每个元素都储存了下一个元素的地址;

    (5)数组的读取速度很快;

    (6)链表的插入和删除速度很快。

    第三章-递归

    (1)递归指的是调用自己的函数;

    (2)每个递归函数都有两个条件:基线条件和递归条件;

    (3)栈有两种操作:压入和弹出;

    (4)所有函数调用都进入调用栈;

    (5)调用栈可能很长,这将占用大量的内存。

    第四章-分而治之(D&C)

    1、分而治之的工作原理:(1)找出简单的基线条件;(2)确定如何缩小问题的规模,使其符合基线条件。

    2、分而治之小结

    (1)分而治之将问题逐步分解。使用分而治之处理列表时,基线条件很可能是空数组或只包含一个元素的元组;

    (2)实现快速排序时,请随机选择作用pivot的元素;

    (3)快速排序的平均运行时间为O(n log n);

    (4)大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因;

    (5)比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(log n)比O(n)快得多。

    第五章-散列表

    1、散列函数得特点

    (1)散列函数总是将同样的输入映射到相同的索引;

    (2)散列函数将不同的输入映射到不同的索引;

    (3)散列函数直到数组有多大,只返回有效的索引。

    2、散列表的应用

    (1)模拟映射关系;(2)防止重复。

    3、散列表小结

    (1)你可以结合散列函数和数组来创建散列表;

    (2)冲突很糟糕,你应该使用可以最大限度减少冲突的散列函数;

    (3)散列表的查找、插入、删除的速度都很快。

    第六章-广度优先搜索

    1、广度优先搜索解决的两类问题

    (1)从节点A出发,有无前往B的节点?

    (2)从节点A出发,前往节点B的哪条路径最短?

    2、广度优先搜索小结

    (1)面临类似于寻找最短路径的问题时,可尝试使用图来建立模型,再使用广度优先搜索来解决问题;

    (2)有向图中的边为箭头,箭头的方向指定了关系的方向;

    (3)无向图中的边不带箭头,其中的关系是双向的;

    (4)队列是先进先出(FIFO)的数据结构;

    (5)栈是后进先出(LIFO)的数据结构;

    (6)你需要按加入顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必须是队列;

    (7)对于检查过的人,务必不要再去检查,否则可能导致无限循环。

    第八章-贪婪算法

    1、如何识别NP完全问题

    (1)元素较少时算法运行速度很快,但随着元素数量的增加,速度会变得非常慢;

    (2)涉及“所有组合”的问题通常是NP完全问题;

    (3)不能将问题分成小问题,必须考虑各种可能情况。这可能是NP完全问题;

    (4)如果问题涉及到序列(如旅行商问题中的城市序列)且难以解决,它可能是NP完全问题;

    (5)如果问题涉及集合(如广播台集合)且难以解决,它可能是NP完全问题;

    (6)如果问题可转换成集合覆盖问题或者旅行商问题,那它肯定是NP完全问题。

    2、贪婪算法小结

    (1)贪婪算法寻找局部最优解,企图以这种方式获得全局最优解;

    (2)对于NP完全问题,最佳的做法是使用近似算法;

    (3)贪婪算法易于实现、运行速度快,是不错的近似算法。

    第九章-动态规划

    1、动态规划问题带来的启示

    (1)动态规划可帮助你在给定约束条件下找到最优解。在背包问题中,你必须在背包容量给定的情况下,偷到价值最高的商品;

    (2)在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决。

    (3)每种动态规划解决方案都涉及网格;

    (4)单元格中的值通常就是你要优化的值。在背包问题中,单元格的值为商品的价值;

    (5)每个单元格都是一个子问题,因此你应考虑如何将问题分成子问题,这有助于你找出网格的坐标轴。

    2、如何设计动态规划的网格?

    (1)网格中的值是什么?

    (2)如何将这个问题划分为子问题?

    (3)网格的坐标轴是什么?

    3、动态规划小结

    (1)需要在给定约束条件下优化某种指标时,动态规划很有用;

    (2)问题可分解为离散子问题时,可使用动态规划来解决;

    (3)每种单元格中的值通常就是你要的优化值;

    (4)每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题;

    (5)没有放之四海皆准的计算动态规划解决方案的公式。

    第十章-K相近邻算法

    1、KNN可以完成的两种基本工作——分类和回归:

    (1)分类就是编组;(2)回归就是预测结果(如一个数字)。

    2、KNN小结

    (1)KNN用于分类和回归,需要考虑最近的邻居;

    (2)分类就是编组;

    (3)回归就是预测结果;

    (4)特征抽取意味着将物品(如水果或用户)转换为一系列可比较的数组;

    (5)能否挑选合适的特征事关KNN算法的成败。

  • 相关阅读:
    python基础----装饰器
    python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
    python基础----文件处理
    python基础
    django时间的时区问题
    django-admin详细设置
    Django框架-模板系统
    Django框架--路由分配系统
    jQuery教程
    django博客项目11
  • 原文地址:https://www.cnblogs.com/lqxing1994/p/9265913.html
Copyright © 2011-2022 走看看