百科问答小站 logo
百科问答小站 font logo



「数据结构」的主要内容有哪些,难度如何,怎样系统地学习? 第1页

  

user avatar   qiongmanong 网友的相关建议: 
      

这个题目不错,数据结构是计算机科学中非常重要的基础!

咱们就翻译一篇medium上超级超级超级火的文章,来学习八种数据结构!


原文链接:medium.com/free-code-ca
原文作者:Fahim ul Haq
原文平台:medium

尼克劳斯·维尔特,瑞士计算机科学家,在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)


哈希表


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

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

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

  1. 哈希函数
  2. 哈希表的容量
  3. 冲突避免方式

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


常见问题:
找数组中的对称对子
追踪旅程的完整路径
检查一个数组是否为另一数组的子集
检查多个数组之间是不是没有共同元素


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

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

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

C++:

JavaScript:

Java:

Python:

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


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

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

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


user avatar   lokinko 网友的相关建议: 
      
数据结构是用来学习如何恰当选择数据的存储方式。
数据结构的产生是为了满足特定的存储要求。

常用的数据结构有:

线性结构:顺序表、链表、队列、栈等。

树状结构:二叉树、AVL树、红黑树、B树等。

图结构:无向图、有向图等。

线性结构

顺序表 / 链表:

从常理上看,我们一般存放数据都是顺序表,例如 在图书馆检索对应内容的书籍时,我们会发现内容上相近的书往往在位置上也相近,这就给我们检索某方向内容时提供了便利。

但是当书堆了很高,而我们想要往里面放书的时候,我们要把盖在上面的大部分书移走,放完这本书后再把书移回来,可想而知,随着放的书越多,插入一本书花费的精力也就越多。

而链表就不一样,链表的设计理念更类似藏宝图之旅,首先你会获得一张藏宝图,

藏宝图上标注了第一个宝藏在哪里,你顺着 藏宝图的指引能够顺利找到第一个宝藏,然后每个宝藏里都保存了下一个宝藏在哪以及下一个宝藏是什么的信息,只有挨个往下找才能找到最终的宝藏。这样可以在任意两个宝藏之间加一个新宝藏,只需要改动相邻两个宝藏的信息就可以完成新元素的插入功能。

队列 / 栈:

现实生活中大家排队都以 队列 为主,排队买东西讲究先来后到,在操作系统上也要讲究先来后到,先发送的指令先运行。

但是有时候 不同紧急程度的问题需要调换执行顺序,先执行紧急度高的任务。例如排队上厕所的时候,要是按照先来后到的原则执行,就会有人尿裤子(捂脸),所以要 产生一种按紧急程度需求的实现方法,于是出现了栈。

为什么要把这种数据结构叫做栈?因为就像古时候的客栈一样,栈是旅客和货物的中转站,是供人们休息的地方。

假设A、B两辆车同向而行,对向来了辆车C,但是因为路太窄了,两辆车不能并排开过去。A、B俩司机商量往后倒车,等 B 先倒车好了 A 才能倒车,然后才能让 C 通行。

栈的特点就是先进来的后出去,就像图里的小汽车一样,只有 B 先离开了,A 才能离开退让。

常见的应用主要有火车、地铁等的调度:

通过栈的设计可以使改变火车运行的顺序,达到火车实时调度的作用。

树状结构

二叉树 / AVL 树:

如果要设计一套问卷调查来评价一个人的内心健康程度,我们通常会列举一系列问题,根据他的回答来评价。

假设每个问题只能回答是否,根据回答跳转到相应的下一个问题,最后得到评价结果。那么在设计问题的时候,如果问题设计不好,就会出现下图的问题:

这个时候就需要 AVL 树的设计思路,使得每个人需要回答的问题数量尽可能相同,不能产生太大的偏差,所以我们就需要花更多时间在问卷的设计中,使得问卷最后变成下图这样:

图结构

无向图 / 有向图:

用 QQ 和微信举例,在 QQ 上,你和你朋友互相属于对方的好友,你们之间的关系是对等的,这种关系是一种无向图。

但是在微信上就不一样,你好友可能是你的好友,但你可能不是你好友的好友(开始套娃),这就是有向图。

为什么会出现有向图呢?因为在很多地方,你可以很方便的过去,但想 原路返回是不被允许的(比方单向通道、奈何桥等),如果哪天地图导航坏了,无法显示单行道,你带着老婆孩子出发去娘家,回来的时候发现到了一条单行道,想必你驻足在车道前沉思的样子,一定会很迷茫。

曾经的支付宝、微信提现是没有手续费的,你的钱从支付宝 - 银行卡 - 微信之间的流通是可以原路返回的,但是现在提现开始收手续费后,每次提现都扣你 0.1% 的手续费,你就会发现有向图有多可恶(咬牙)。

所以,要是不能准确表示这种原路返回的特征,就需要指明不同结点之间的不对等关系,所以就会出现有向图等结构。


数据结构的出现就是为了更好地管理、存储数据,每一种数据结构的设计都是用来解决某种程度上的问题。

在学习数据结构前,可以想象一下这种数据结构能应用在哪些场景,有什么优缺点。

想要系统地学习数据结构,可以先学习 C 语言,然后动手学习数据结构的 C 语言实现,能够让你更清晰、迅速地掌握数据结构! @知识库




  

相关话题

  二分查找有几种写法?它们的区别是什么? 
  为什么数学专业要学计算机? 
  Size Balanced Tree 真的是国内 ACM 选手陈启峰的发明吗? 
  物理系学生如何提高编程水平? 
  大公司笔试面试有哪些经典算法题目? 
  为什么 Windows 系统 Program Files 这个经常用来装软件的目录,名称中有个空格? 
  蒋凡「疑似出轨张大奕」被除名合伙人,阿里程序员「通过内部代码抢月饼」被开除,如何看待二者的惩罚力度? 
  Linux下有哪些给你带来「快感」的软件? 
  想在业余时间刷leetcode,配合什么书籍/课程/视频网站一起刷leetcode的效率最高? 
  凭现在的技术能做出以假乱真的游戏画质吗? 

前一个讨论
如何看待西北工业大学部分队伍在2020年全国大学生数学建模竞赛中涉嫌作弊?
下一个讨论
「腹式呼吸」的原理是什么,如何训练「腹式呼吸」呢?





© 2024-12-22 - tinynew.org. All Rights Reserved.
© 2024-12-22 - tinynew.org. 保留所有权利