从咱们接触开发开始,算法 + 数据结构 = 程序 都是咱们认同的。不少开发岗位都要求深刻了解数据 结构,院校的计算机专业中,数据结构都是必修课程。在面试中,不少面试官会提到,例如:二叉树,红黑树,或者“医院的看病人挂号排队该怎么处理”。node
数据结构是计算机存储、组织数据的方式。git
数据是程序的核心要素,无论咱们是在写商城类的应用,仍是社交类的应用,亦或股票类的应用,咱们都须要处理其数据,如商品数据、消息数据、股票价格等等。对于特定的数据结构(好比数组),有些操做效率很高(读某个数组元素),有些操做的效率很低(删除某个数组元素)。程序员的目标是为当前的问题选择最优的数据结构。程序员
计算机发展至今,有不少数据的组织方式,而咱们经常使用的差很少是下面的一种之一:github
是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)能够计算出该元素对应的存储地址面试
数组根据维度区分,有两种数组:算法
因为数组是连续性的内存,因此做删除和插入时会致使内存数据的移动,对如今的计算速度来讲并不算什么,单在编写中仍是尽可能避免。express
栈和队列都是动态集合,且在其上的 delete 操做所移除的元素是预先设定的。栈实现的是后进先出(last-in, first-out, LIFO),删除的老是最近插入的元素,而队列则是先进先出(first-in, first-out, FIFO),老是存在时间最长的被移除。编程
栈的应用最为熟知的 Ctrl + Z
,而队列的操做于咱们生活中排队买票、结帐的场景同样。api
栈:数组
队列:
堆(heap)是计算机科学中一种特别的树状结构,其特性是:“给定堆中任意节点P和C,若P是C的母节点,那么P的值会小于等于(或大于等于)C的值”
也就是说,若母节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端的那一个节点,称做根节点(root node),根节点自己没有母节点(parent node)
对于操做系统,任务调动程序的工做是频繁的,而每一个任务须要时间/资源/权重有长短,对于这些不一样操做任务来讲,队列/栈等按必定顺序的数据结构已经不适应了,而堆的出现能够解决这个问题。
堆的实现经过构造二叉堆(binary heap),实为二叉树的一种;因为其应用的广泛性,当不加限定时,均指该数据结构的这种实现。这种数据结构具备如下性质。
将根节点最大的堆叫作最大堆或大根堆,根节点最小的堆叫作最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
链表是线性结构,用指针连接数据的方式串联数据,但数据并不会按线性顺序存储。与数组不一样的是,链表插入或删除数据的时候不须要移动数据,存储的数据也不是连续的内存,其充分利用计算机内存空间,实现灵活的内存动态管理。 链表没有随机读取的优势,并且空间开销比较大。 链表有一下几种经常使用的类型:
链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域。这个连接指向列表中的下一个节点,而最后一个节点则指向一个空值
双向链表相比与单链表的优点在于它同时支持高效的正向及反向遍历,而且能够方便的在链表尾部删除结点(单链表能够方便的在尾部插入结点,但不支持高效的表尾删除操做)
与单链表同样,只是最后的节点指向的是首节点
在计算机科学中,树 (Tree) 是一种抽象数据类型(ADT)或是实做这种抽象数据类型的数据结构,用来模拟具备树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具备层次关系的集合。把它叫作“树”是由于它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
哈希(Hash) 将某个对象变换为惟一标识符,该标识符一般用一个短的随机字母和数字组成的字符串来表明。哈希能够用来实现各类数据结构,其中最经常使用的就是 哈希表 (hash table)。
哈希表也称为 散列表,是根据 **键(Key)**而直接访问在内存存储位置的数据结构。也就是说,它经过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称作散列函数,存放记录的数组称作散列表。 其性能取决于3个指标
hash(k)=k
或 hash(k)=ak+b
,其中 a,b
为常数(这种散列函数叫作自身函数)hash(k)=k mod p, p <= m
。不只能够对关键字直接取模,也可在折叠法、平方取中法等运算以后取模。对 p 的选择很重要,通常取素数或 m,若 p 选择很差,容易产生冲突。图(graph)由多个节点(vertex)构成,节点之间阔以互相链接组成一个网络。(x, y)表示一条边(edge),它表示节点 x 与 y 相连。边可能会有权值(weight/cost)。
图能够分为:有向图、无向图,编程语言中可能有:邻接矩阵、邻接表 对于图的搜索算法,则是: