数据结构与算法(二):数据结构基础

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通过哈希函数获得的下标有可能是一样的)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值