数据结构就是你的工具箱,这些工具箱帮你把同类的信息装到了一起,同时还提供给你操作这些信息的各种便捷方法。

数据结构是计算机中的重中之重,而且数据结构一般和算法结合比较紧密,加上,数据结构和算法往往是算法面试中考察的最重要内容,因此,学好,并且练好这些内容,就非常重要了。

下面这份数据结构的内容,能让大家对数据结构有个初步的了解,而且还有各个语言的配套课程,能让大家从理论到实践去真正掌握好这门计算机核心基础。

数据结构其实内容也很多的,各种高级的数据结构也层出不穷。

看书的话推荐大话数据结构:

自学编程的小伙伴,入门语言推荐python,学有余力再学其他的就好。

题主想学C++的话,那就看看这一门:

尼克劳斯·维尔特,瑞士计算机科学家,在1976年写了一本名为《算法 + 数据结构 = 程序》的书。

40多年转瞬即逝,但这个公式依然成立。这也是今天我们程序员面试的时候,需要展示自己对数据结构以及他们应用场景的掌握的原因。

几乎所有的问题都需要面试者证明他们具有扎实的数据结构基本功。无论你是刚毕业也好(从大学还是编程培训营),还是有N多年的经验。

有时候这些面试题则是专门提到某种数据结构。比如,题目描述是这样开头的“给定一颗二叉树。。。”。其他的时候则是那种隐式的,比如说,“我们找到每个作者相关的书籍数目”。

学习数据结构是非常重要的,哪怕你只是想在当前的工作岗位上变得更赞一点。所以,就让我们从基础开始吧。

啥是数据结构?

简单来说,数据结构就是一种容器,按照某种既定的方式存储数据。这种“方式”能让一个数据结构在某些操作下很高效,相反,在另外的操作下就不太理想了。你的目标是为了理解这些数据结构,从而可以能从不同的数据结构中选择适合当前所面对的问题的那一种。

为啥需要数据结构?

因为数据结构是用来有规则地存储数据的,加上数据结构在计算机科学中神一般的存在,他们的价值就不言而喻了。

不过你要解决的问题是啥,你反正都得需要数据结构,方式可能不同而已。无论是面对员工工资,还是股票价格,购物清单,还是简单的电话本,这样的场景。

根据不同的应用场景,数据需要按照不同的方式存储。我们有好多可以将数据按照不同方式保存下来的数据结构。

常用的数据结构

我们先来列一下最最常用的八种数据结构,然后接下来我们会慢慢将他们讲明白。

数组

队列

链表

字母树(其实他们就是树而已,但还是值得单独拿出来讲的)

哈希表

数组

数组是最简单也最常用的数据结构。其他的数据结构诸如栈和队列,都是从数组衍生出来的。

下面是一个拥有四个元素的简单数组,包含了元素1,2,3,4. />

每个元素都依附于一个正整数,称作索引,它就对应于数组中该元素所在的位置。大多数的编程语言中,数组的起始索引都为0 (0-based,译者注).

数组一般有以下两种:

一维数组(上图所示)

多维数组(数组里面包含数组)

数组的基本操作

插入 — 在给定位置插入一个元素

取值 — 返回给定位置的数值

删除 — 在给定位置删除元素

元素总数 — 数组包含元素的个数

数组类常问问题

数组中第二小的数

数组中出现的第一个无重复的数

合并两个已排序数组

重新排放数组的正数和负数

我们平时熟悉的软件操作中的撤销(回退)操作,基本会出现在所有应用中。你好奇过它是咋工作的吗?原理是这样的:你把之前的状态(有限的数量)都存到内存中,存的顺序是最新的操作存在最近一个。这个光靠数组是不能实现的。这是栈擅长的地方。

现实中也有栈的例子。比如你把一大堆书垂直叠(一本压着另外一本)起来放。为了拿到他们里面靠中部位置的书,你得把上面的书都拿走才行。这就是著名的LIFO(后进先出)的工作原理。

下图是一个包含有三个元素的栈,数值为1,2,3. 元素3在栈顶,它会被最先删除。 />

栈的基本操作进栈 — 在栈顶插入元素

出栈 — 把栈顶元素弹出(删除)

判空 — 返回栈是否为空

栈顶元素 — 只返回栈顶元素而不删除

译者注:对于栈所有的操作,都只出现在栈顶这个地方

栈常见的面试问题

借助栈来计算后缀表达式的值

将栈里的元素进行排序

判断括号表达式是否合法

队列

和栈类似,队列是另外一种线性数据结构。这种数据结构将元素按照顺序的方式存储。和栈最本质的区别就是:和后进先出相反,队列实现了先进先出的特性(FIFO, First in First Out)。

队列在生活中有非常贴切的例子:一堆人排在售票台前面。如果新来了一个人,这个人得排在队尾,而不是队伍前面。另一方面,排在第一的人则能第一个买到票,然后离开队伍。

下面是一个包含了四个元素的队列(1, 2, 3, 4)。1站在队头,会被第一个删除。 />

队列的常用操作进队 — 在队尾加入一个元素

出队 — 从队头删除元素

判空 — 判断队列是否为空

队头元素 — 返回但不删除队头元素

常见的队列题

用队列实现栈

将队列里面的前k个元素翻转

借助队列来产生从1到n的二进制数

链表

链表是另外一种重要的线性数据结构。链表初看起来和数组很类似,但他们在内存分配,内部结构,以及像插入和删除这样的基本操作上,都是不一样的。

链表就是一串 串起来 的节点,他们的每一个节点都包含了数据和指向下一个节点的信息。链表有头结点,指向链表中的第一个元素。

链表结构经常用来实现文件系统,哈希表,以及邻接表。

下图是一个链表的内部结构图示。 />

我们常见的链表有以下两种:

Singly Linked List (Unidirectional)

Doubly Linked List (Bi-directional)

单链表 (单一方向)

双链表 (双向)

链表基本操作:

末端插入 — 在链表的末尾插入给定元素

头部插入 — 在链表的头部插入给定元素

删除 — 在链表中删除给定元素

头部删除 — 删除头部第一个元素

搜索 — 判断给定元素是否存在于链表中

判空 — 判断链表是否为空

常见的链表问题

翻转链表

检查链表中是否有环

返回距离尾部距离为N的节点

删除链表中的重复元素

图包含一系列的节点,这些节点通过网络相互连接起来。这些节点也被称为Vertcies。对于每个对子(x, y),我们则称为边,表示节点x和节点y是相连的。边也可能包含权重或是花费信息,表明了从x到也所需要的消耗。 />

图的类型:无向图

有向图

在计算机语言中,图通常用下面两种方法表示:邻接矩阵

邻接表

常用的图遍历算法:宽度优先搜索

深度优先搜索

常见的图问题

实现宽搜和深搜

判断一个图是不是一棵树

数图中的边数

找两个节点之间的最短路径

树是非线性数据结构,它也是由节点和边组成的。因此树和图类似,但他们最大的不同是树上没有环存在。

树被广泛应用在AI和其他复杂算法中,因为它能提供高效的存储,使得问题能得以解决。

下面是一颗简单树,图中也包含了常见的树的术语。 />

我们可以有以下的各种树的形状:N叉树

平衡树

二叉树

二叉搜索树

AVL树

红黑树

2-3树

上面这些树中,以二叉树和二叉搜索树最为常用。

常见的树的问题

求二叉树的高度

求二叉搜索树中的第k大的数值

找离根节点距离为k的所有节点

找给定节点的所有祖先节点

字母树

字母树,也叫做前缀树,是一种树形的数据结构,它是一种解决字符串相关的问题的高效数据结构。能快速查询回馈信息,经常用在字典中查询单词的场景下,它能为搜索引擎提供自动补全,甚至能帮到IP查询。

下图演示了如何将三个单词(top, thus, their)插入到字母树中,并保存下来: />

在字母树中,单词都是从下至下一个字母一个字母保存起来的。绿色的节点(p, s, r)表示的是该节点是一个单词的最后一个字母,p对应top,s对应thus,而r则对应于their。

常见的字母树问题:

数字母树中的单词总数

打印字母树中所有的单词

用字母树排序数组

借助字母树来从字典中取单词

建一个满足T9的字典(译者注:T9 stands forText on 9 keys)

哈希表

哈希是一个分辨不同的实体,从而将每个实体存储在某个预先计算好的索引上,这个预先算出来的值被称作“键”。因此,实体都是由键值对的形式存放的,把一大堆这样的东西称为字典。每个实体都能通过键来找到。基于哈希这种思想的数据结构有不少,但最常用的是哈希表。

哈希表一般通过数组来实现。

哈希表的效率取决于以下三个因数:哈希函数

哈希表的容量

冲突避免方式

下面这图演示了我们是怎么从哈希值匹配到一个数组中的。该数组的索引是通过函数函数求出来的。

常见问题:

找数组中的对称对子

追踪旅程的完整路径

检查一个数组是否为另一数组的子集

检查多个数组之间是不是没有共同元素

上面就是八种你在算法面试之前必知必会的数据结构。

具体的学习,可以参考原文作者开发educative上的数据结构课程:

专门针对数据结构的课程则有:

C++:Data Structures in C++: An Interview Refresher​www.educative.io

JavaScript:Data Structures in JavaScript: An Interview Refresher​www.educative.io

Java:Data Structures in Java: An Interview Refresher​www.educative.io

Python:Data Structures in Python: An Interview Refresher​www.educative.io

我上过其中的Java版本,课程是把数据结构里面的基础数据结构都用java实现了一遍,对于用java的同学特别有帮助,java的基础在刷题的过程中,还是要必须掌握的。

(如果你需要上面这些算法课程,那么你可以使用 awesome-developer 的折扣码获得网站所有课程的额外15%off!上面的折扣码针对单独购买所有课程有效。

如果想买订阅(Subscriptions)的小伙伴,则可以用0820-ZH93025(必须一模一样输入)的coupon code来获取额外八折的优惠按年和按月均适用,折扣码十月四号过期,有需要的小伙伴抓紧)。

过了十月四号就只能用 ZHIHUEDU-10的九折优惠了,大家有需要的抓紧,还有不到两周!

其他的计算机课程,参考回答:一个不是很了解CS(计算机科学)的人,该从哪里开始自学CS?​www.zhihu.com

python数据结构推荐书-自己想学数据结构,有大佬能推荐一下看什么书吗?相关推荐

  1. 简学Python第二章__巧学数据结构文件操作

    Python第二章__巧学数据结构文件操作 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表 元祖 索引 字典 序列 文件操作 编码与文件方法 本站开始将引入一个新的概 ...

  2. 想学非标机械设计的朋友看过来!不然后悔终生!

    想学非标机械设计的朋友看过来!不然后悔终生! 一.非标机械设计具体是什么? 简单的说就是非标准设备以及非标准件. 非标准工装的设计. 举例说: C616 C620 C630 C6125 M7475 B ...

  3. 想学非标机械设计的朋友看过来!不然后悔终生

    想学非标机械设计的朋友看过来!不然后悔终生! 一.非标机械设计具体是什么? 简单的说就是非标准设备以及非标准件. 非标准工装的设计. 举例说: C616 C620 C630 C6125 M7475 B ...

  4. 大学想要选择学习自动化专业,可以看什么书去提前了解?

    大学想要选择学习自动化专业,可以看什么书去提前了解? 自动化是一个很大的范畴,这里有很多技术.例如许多小区大门的自动人脸识别开门系统,就是自动化的应用之一.在自动化里,自动控制占了很大的比重. 题主显 ...

  5. php学数据结构,PHP 程序员学数据结构与算法之《栈》

    介绍 "要成高手,必练此功". 要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实 ...

  6. python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单

    推荐一下「算法与数据结构」从入门到进阶的书单. 一.入门系列 这些书籍通过图片.打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现, ...

  7. 用了一年整理的Python所有库!想学的都在这

    前言 文章有点长,请耐心看完,希望不要辜负小编的辛勤付出!文末准备了一些编程资料,文末免费分享给大家! 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理 ...

  8. json解析 子类和父类同名属性如何赋值_想学变量的解构赋值?看完这一篇就够了...

    序言 ES6允许按照一定模式从数组和对象中提取值,然后对变量进行复制,这被称为解构(Destructuring) 数组的解构赋值 基本用法 像上面的例子,可以从数组中提取值,按照对应位置对变量赋值,这 ...

  9. 零基础想学web前端开发?可以多看看这些书!

    目前市场上HTML.CSS 类别书籍,都是大同小异,在当当网.卓越网搜索一下很多推荐.小编多年开发经验总结:Javascript 的书籍推荐看老外写的,国内很多 Javascript 书籍的作者对 J ...

最新文章

  1. Find The Multiple POJ - 1426(只包含01的十进制倍数(同余模定理))
  2. 深度学习之反向传播算法
  3. 用c语言找出第123个素数,在C语言中查找第N个素数
  4. linux中特殊字符的含义,Linux中的特殊符号以及特殊语法
  5. 树莓派接入公网(花生壳)
  6. 法国 计算机金融 大学,捷报|GPA3.0,计算机转申金融,斩获法国顶级商学院录取!...
  7. 国内CDH的MAVEN代理
  8. golang channel的一些总结
  9. 浅谈java的静态代理模式
  10. http请求出现406错误解决方案
  11. CTFWeb——Bugku秋名山老司机 详细题解
  12. 利用ST MCU内部基准参考电压监测电源电压及其它
  13. html中div排版布局
  14. 去掉首尾字符java_Java去除字符串首尾特定字符
  15. 沐风老师3DMAX网球建模教程
  16. 在sqli-liabs学习SQL注入之旅(第十一关~第二十关)
  17. MInd+实例4——公园人数计数系统
  18. 2021牛客寒假算法基础集训营4 F. 魏迟燕的自走棋
  19. android 数据传递工具,AnyTrans for Android for Mac(安卓手机数据传输工具)
  20. 基于决策树的电网负荷预测

热门文章

  1. 安装仅限于用于sharepoint_PDF DC2018软件安装教程
  2. No field mFactorySet in class问题解决(上)
  3. :x 和 :wq 的区别
  4. 开发日记-20190803 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 19
  5. Kotlin学习 PART 2:kotlin基础
  6. 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。...
  7. docker 部署nginx
  8. mysql 查询 插入
  9. Golang通道的无阻塞读写的方法示例
  10. 可靠数据传输原理1(构造可靠数据传输协议)