数据结构的存储方式

数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储).

我们分析问题,一定要有递归的思想,自顶向下,从抽象到具体.散列表、栈、队列、堆、树、图等这些都属于「上层建筑」,而数组和链表才是「结构基础」.因为那些多样化的数据结构,究其源头,都是在链表或者数组上的特殊操作,API 不同而已

底层存储无非数组或者链表,二者的优缺点如下:
数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间.但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N).更适合查询操作.
链表因为元素不连续,而是靠指针指向下一个元素的位置,所以不存在数组的扩容问题;如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度 O(1).但是正因为存储空间不连续,你无法根据一个索引算出对应元素的地址,所以不能随机访问;而且由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间.更适合增加和删除操作.

数据结构的基本操作

对于任何数据结构,其基本操作无非遍历 + 访问,再具体一点就是:增删查改。数据结构种类很多,但它们存在的目的都是在不同的应用场景,尽可能高效地增删查改,这就是数据结构的使命

如何遍历 + 访问?我们仍然从最高层来看,各种数据结构的遍历 + 访问无非两种形式:线性的和非线性的。
线性就是 for/while 迭代为代表,非线性就是递归为代表。

线性遍历是一个框架,非线性遍历是一个框架,非线性遍历的结构,遍历框架都是一致的.所谓框架,就是套路.不管增删查改,这些代码都是永远无法脱离的结构,你可以把这个结构作为大纲,根据具体问题在框架上添加代码就行了

算法刷题指南

首先要明确的是,数据结构是工具,算法是通过合适的工具解决特定问题的方法.也就是说,学习算法之前,最起码得了解那些常用的数据结构,了解它们的特性和缺陷.

从框架上看问题,就是像我们这样基于框架进行抽取和扩展,既可以在看别人解法时快速理解核心逻辑,也有助于找到我们自己写解法时的思路方向.当然,如果细节出错,你得不到正确的答案,但是只要有框架,你再错也错不到哪去,因为你的方向是对的.但是,你要是心中没有框架,那么你根本无法解题,给了你答案,你也不会发现这就是个树的遍历问题.这种思维是很重要的

动态规划详解中总结的找状态转移方程的几步流程,有时候按照流程写出解法,说实话我自己都不知道为啥是对的,反正它就是对了.这就是框架的力量,能够保证你在快睡着的时候,依然能写出正确的程序,就算你啥都不会,都能比别人高一个级别.

刷算法题建议从「树」分类开始刷,结合框架思维,把这几十道题刷完,对于树结构的理解应该就到位了。这时候去看回溯、动规、分治等算法专题,对思路的理解可能会更加深刻一些。为什么要先刷二叉树呢,因为二叉树是最容易培养框架思维的,而且大部分算法技巧,本质上都是树的遍历问题.不要小看这几行破代码,几乎所有二叉树的题目都是一套这个框架就出来了.
void traverse(TreeNode root) {
// 前序遍历
traverse(root.left)
// 中序遍历
traverse(root.right)
// 后序遍历
}

Hard 难度的题目不过如此,而且还这么有规律可循,只要把框架写出来,然后往相应的位置加东西就行了,这不就是思路吗.对于一个理解二叉树的人来说,刷一道二叉树的题目花不了多长时间.那么如果你对刷题无从下手或者有畏惧心理,不妨从二叉树下手,前10道也许有点难受,结合框架再做20道,也许你就有点自己的理解了,刷完整个专题,再去做什么回溯动规分治专题,你就会发现只要涉及递归的问题,都是树的问题.其实很多动态规划问题就是在遍历一棵树,你如果对树的遍历操作烂熟于心,起码知道怎么把思路转化成代码,也知道如何提取别人解法的核心思路.
总结:
数据结构的基本存储方式就是链式和顺序两种,基本操作就是增删查改,遍历方式无非迭代和递归。

「上层建筑」与「结构基础」~不被迷惑相关推荐

  1. 「文本信息抽取与结构化」详聊文本的结构化「下」

    2020-02-19 08:20:08 常常在想,自然语言处理到底在做的是一件什么样的事情?到目前为止,我所接触到的NLP其实都是在做一件事情,即将自然语言转化为一种计算机能够理解的形式.这一点在知识 ...

  2. 如何做到招聘要求中的「要有扎实的 Java 基础」

    如何做到招聘要求中的「要有扎实的 Java 基础」 来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰," ...

  3. 「文本信息抽取与结构化」目前NLP领域最有应用价值的子任务之一

    常常在想,自然语言处理到底在做的是一件什么样的事情?到目前为止,我所接触到的NLP其实都是在做一件事情,即将自然语言转化为一种计算机能够理解的形式.这一点在知识图谱.信息抽取.文本摘要这些任务中格外明 ...

  4. 「软件测试基础」理论篇之软件测试概论

    文章目录 1. 软件 1.1 软件发展史 1.2 软件生命周期 1.3 软件缺陷 1.4 三种纠错技术 2. 软件过程 2.1 RUP 2.1.1 RUP各个阶段 2.1.2 RUP核心工作流 2.2 ...

  5. 「R shiny基础」交互式入门

    上一节的「R shiny基础」增加一些小控件放在网页中的控件只能说是装饰品,要想真正让用户通过选择不同参数来得到不同结果,还需要这一节的知识 举个例子:我们希望下面网页在左边选择后,右边会有对应的输出 ...

  6. 产业互联网,让互联网由「上层建筑」变成「基础设施」

    如果对消费互联网时代的互联网玩家们的特质进行一次总结的话,它就是一个华丽且庞大的「上层建筑」.在这样一个「建筑」里,谁能够建筑得足够大,足够富丽堂皇,谁就能够获得足够多的资本关注,谁就能够获得足够多的 ...

  7. 人工智能的大统一理论? | 智源大会-「人工智能的数理基础」专题论坛

    当下人工智能面临着可计算性.可解释性.泛化性.稳定性等诸多重大理论挑战,如何打破基于计算机实验和认知神经科学的人工智能传统建模范式,建立起以数学与统计理论为第一原理的新一代人工智能方法论,依然是待开垦 ...

  8. vscode php插件_「PHP从入门到颈椎病康复」基础篇——HelloWorld

    需要的前驱知识 在学习这篇文章之前,需要有一点HTML的基础,需要的小伙伴可以点开我的主页,查看<「HTML从入门到颈椎病康复」>系列文章. 啥玩意是php PHP:"超文本预处 ...

  9. php app接口开发,「PHP开发APP接口实战005」基础示例接口的实现一

    前一章,我们对接口参数基本定义做了一个简要说明.里面提到了几个示例接口,接下来,我们就来讲解这个几点个示例接口的具体实现. 「PHP开发APP接口实战004」基础响应参数说明 前言 由于我们的接口返回 ...

最新文章

  1. 句法分析应用领域及意义
  2. SAP 电商云 Spartacus 产品明细页面的 pageContext 如何获取的?
  3. Layui --- [Mar]给渲染后的表格加CSS样式
  4. JPA / Hibernate实体状态转换的初学者指南
  5. 服务总线yali测试_服务器的压力测试方法与流程
  6. RxJava线程控制
  7. java如何实例化集合_如何在java中实例化一个Queue对象?
  8. NIO的空轮询bug是什么?netty是如何解决NIO空轮询bug的?
  9. C语言---输出三角形字符阵列
  10. 【NLP入门】手把手带你CNN文本分类(附代码)
  11. java中 获取classpath路径
  12. 虚拟人出新晋卷王,无薪工作70天却没人认出来
  13. sitemesh学习
  14. Thinkphp 模板/包含文件
  15. 如何将amr文件转成mp3格式?
  16. 自主招生计算机专业自我介绍,自主招生自我介绍范文【自主招生个人论述范文】...
  17. 阿里内核月报2014年12月
  18. 记录常用正则表达式(亲测,有用)
  19. 数据增广:旋转,缩放,平移以及错切
  20. java学习5:公告管理案例

热门文章

  1. 对搜狗云输入法的胡思乱想
  2. Python入门及官网教程
  3. android 更改窗口的层次,浮窗开发之窗口层级
  4. 2023年网络爬虫实训(第二天)
  5. 使用ChatGPT打造短视频爆款开头, ChatGPT联网啦, 可以直接播放周杰伦的音乐
  6. TypeScript 实用工具类型之 Partial 类型
  7. Qt之标准对话框(QMessageBox、QFileDialog)
  8. 英语语法超图解1:20个一定要知道的语法概念
  9. Camera2 Google官方demo android-Camera2Basic分析
  10. 瑞格尔侯爵葡萄酒之城大师班