数据结构与算法学习导言

0. 为什么要学习数据结构与算法

学习整理自 极客时间《数据结构与算法之美》专栏

为什么要学习数据结构与算法?

  • 通过大厂面试;
  • 业务开发工程师,真的愿意做一辈子CRUD boy? 对阅读框架源码和理解其背后的设计思想很有用;
  • 基础架构研发工程师,写出达到开源水平的框架才是你的目标!高手对决看细节,这些细节包括算法是否优化、数据存取效率是否高、内存是否节省;
  • 对编程有追求,不想被行业淘汰,就不能只会写凑合能用的代码;

1. 如何系统高效学习数据结构与算法

一、数据结构与算法的定义与关系

数据结构就是一组数据的存储结构,算法就是操作数据的一组方法,数据结构是为算法服务的,算法要作用在特定的数据结构上。

二、学习的重点:

  • 复杂度分析
  • 10个常用数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;
  • 10个常用算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法;
    数据结构与算法学习导言_第1张图片

三、学习技巧:

  • 对于一个新知识,一定要学习它的来历,自身的特点,适合解决的问题,实际的应用场景;
  • 边学边练,适度刷题;
  • 多问、多思考、多互动;
  • 知识需要沉淀,不要试图一下子掌握所有;

2. 复杂度分析

一、为什么要进行复杂度分析及什么是复杂度分析

事后统计法具有局限性,因此需要一个不用具体的测试数据来测试,就可以粗略估计算法执行效率的方法。数据结构与算法解决的是“如何让计算机更快时间、更省空间的解决问题”,因此需要从执行时间和占用空间两个维度进行评估,复杂度描述的是算法执行时间(占用空间)与数据规模的增长之间的关系。掌握复杂度分析,能编写出性能更优的代码,有利于降低系统开发和维护成本。

  • 测试结果非常依赖测试环境;
  • 测试结果受数据规模的影响很大:

二、如何进行复杂度分析,大O表示及计算法则
大O复杂度表示,T(n)= O(f(n)),T(n)表示代码执行时间;n表示数据规模;f(n)表示每行代码执行的次数总和;O表示代码执行时间和f(n)表达式成正比;其表示代码执行时间随数据规模增长的变化趋势,也叫渐进时间复杂度。在n很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,所以可以忽略。
时间复杂度分析:

  • 只关注循环执行次数最多的一段代码。
  • 加法法则:总复杂度等于量级最大的那段代码的复杂度。
  • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。

三、常用的时间(空间)复杂度
时间复杂度分析:

  • 多项式量级:O(1),O(logn),O(n),O(nlogn),O(n^k),O(m+n),O(m*n)
  • 非多项式量级:O(2^n),O(n!)

空间复杂度分析:O(1),O(n),O(n^2)
四、如何掌握好复杂度分析?
关键在于多练习,多思考,熟能生巧。

五、复杂度深度分析

  • 最好情况时间复杂度:在理想情况下,执行这段代码的时间复杂度。
  • 最坏情况复杂度:在最糟糕情况下,执行这段改吗的时间复杂度。
  • 平均时间复杂度:取所有情况的平均值,也叫加权平均时间复杂度或期望时间复杂度。
  • 均摊时间复杂度:每一次O(n)的插入操作后都跟着n-1次O(1)次插入操作,所以把耗时较多的操作时间均摊到接下来的n-1耗时少的操作上,这样时间复杂度就为O(1)。适用场景为在一组连续操作中,大部分情况下的时间复杂度都很低,只有个别情况的时间复杂度比较高,并且这些操作之间存在前后连贯的时序关系。
 // array 表示一个长度为 n 的数组
 // 代码中的 array.length 就等于 n
 int[] array = new int[n];
 int count = 0;
 
 void insert(int val) {
    if (count == array.length) {
       int sum = 0;
       for (int i = 0; i < array.length; ++i) {
          sum = sum + array[i];
       }
       array[0] = sum;
       count = 1;
    }

    array[count] = val;
    ++count;
 }

上述代码功能:往数组中插入数据,若数组有空闲位置,则直接插入;如果数组满,则遍历求和之后将sum值放在数组首位继续插入数据。其在数组非满时最好时间复杂度为O(1),在数组满时时间复杂度为O(n),平均时间复杂度为O(1)。

  • 平均时间复杂度(代码在不同情况下复杂度出现量级差别,用代码所有可能情况下的执行次数的加权平均值表示)VS均摊时间复杂度(满足两个条件,高级别复杂度操作远大于低级别复杂度操作;两种操作出现具有时序规律)

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