1、数组 数组的英文是array,是有限个相同类型的变量所组成的有序集合,数组中的每个变量都被成为元素,一旦创建,数组的长度是固定的,不能更改。数组是最简单、最常用的数据结构。
**特点:**在内存中顺序存储,可以很好的实现逻辑上的顺序表,元素之间紧密排列,既不能打乱元素的存储顺序,也不能跳过某个存储单元进行存储 **数组的基本操作:**读取元素、更新元素、插入元素、删除元素 **数组的优势和劣势:**高效随机访问,只要给出下标,就可以用常量时间找到元素。二分查找就是利用了数组的这个特性。但是在插入和删除元素时,都会导致大量元素被迫移动,影响效率。所以,数组适合的是读操作多,写操作少的场景。
2、链表 链表是一种在物理上非连续、非顺序的数据结构,由若干节点所组成。链表与数组是相反的,灵活隐秘的传递着信息。 **单向链表:**每个节点包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。最后一个指针指向null。 双向链表:除了每个节点拥有data和next指针,还有指向前置节点的prev指针。 链表的基本操作:查找节点、更新节点、插入节点、删除节点 链表中的数据只能按顺序进行访问,查找最坏的时间复杂度是O(n).如果不考虑查找的过程,更新节点会像数组一样简单,直接更新即可。如果不考虑插入、删除操作之前的查找元素的过程,纯粹的插入和删除操作,时间复杂度是O(1)。 链表和数组都属于线性的数据结构,但是链表在插入和删除操作更灵活。
3、栈和队列
栈和队列是一种线性逻辑结构,可以用数组实现,也可以用链表实现,栈包含入栈和出栈操作,遵循先入后出的原则(FILO)。队列包含入队和出队操作,遵循先入先出的原则(FIFO).时间复杂度都是O(1). 注意:队列的循环。当出队一些元素后,在不扩充数组的情况下,利用已出队元素留下的空间,让队尾指针重新指向数组的首位。 栈和队列的应用: 栈可以实现回溯,例如递归的逻辑,也可以用来做面包屑导航,用户在浏览页面时可以轻松回溯到上一级或更上一级页面。 队列的输出和输入顺序相同,所以队列通常用于对“历史”的回放。比如在网络爬虫实现网站抓取时,也是把待抓取的网站URL存入队列中,再按存入队列的顺序一次抓取和解析。 扩展:双端队列(既可以先进先出,也可以后进后出),优先队列(谁的优先级最高,谁先出队,是基于二叉堆实现的)
4、散列表 散列表又叫哈希表,是存储Key-Value映射的集合。对于某一个Key,散列表可以在接近O(1)的时间内进行读写操作,散列表通过哈希函数实现KEY和数组下标的转换(哈希表本质也是数组,数组是根据下标查找,而Key是以字符串类型为主的),通过开放寻址法和链表法来解决哈希冲突(哈希冲突是指数组长度是有限的,当插入的元素越多时,不同的key通过哈希函数获得的下标有可能是一样的)。
|