数组和链表
数据结构和算法
程序 = 算法 + 数据结构
# 数据结构:数据的组织形式
-数字
-字符串
-数组
-链表
-字典
-对象
# 什么是算法:
算法就是你写的那堆代码,那堆逻辑
数组和链表
数组和链表是我们最常用也是最基本的数据结构,严格来说基础的数据结构就只有两种,就是数组和链表,其他的各种高阶的数据结构都是从数组和链表中衍生出来的,所以说数组和链表是一切数据结构的根本,我们完全有必要更深层次的理解这两种数据结构
什么是数组
-内存中连续存储的空间
-数组它是由相同类型的元素的集合所组成的一种线性数据结构
# 什么是链表
-链表是一种不要求内存连续的顺序存储数据结构,它的数据节点可以分布在内存中的各个地方,节点之间是各自记录着下一个元素的指针,通过指针把所有节点串联起来组成了一条链装的结构
数组和链表的操作
# 数组的插入,删除,扩容,缩容
-把赵六插入到第1个位置,需要把从第一个位置开始,都要往后移动
['zs' 'ls' 'ww' 'oo']
-插入元素:时间复杂度和空间复杂度都是O(n)
-删除元素:时间复杂度和空间复杂度都是O(n)
-查找元素:时间复杂度和空间复杂度都是O(1)
-大O表示法:时间复杂度,空间复杂度--->衡量算法优劣标准
O(1) :一次操作就能完成
O(log n):数据大小的一半操作就能完成
O(n):数据大小操作就能完成:一层for循环完成
O(n方):两层for循环
# 链表插入,删除,扩容,缩容
'zs' ---> 'ls' ---> 'ww' ---> 'oo'
-插入元素:时间复杂度和空间复杂度都是O(1)
-删除元素:时间复杂度和空间复杂度都是O(1)
-查找元素:时间复杂度和空间复杂度都是O(n)
-单向链表
-双向链表
-循环链表
-如果判断链表中是否有环
拓展
# java:List:ArrayList LinkedList
# python:列表--->基于数组
-插入元素,删除元素
# redis的hash类型(字典类型)-->底层基于数组
-开放寻址法:当发生hash冲突时,会以当前地址为基准,然后根据寻址方法(探查寻址),去寻找下一次地址。若依旧发生冲突,则继续寻址,直到找到一个空的位置为止
-线性探测法
-平方探测法(二次探测)
-链地址法(最多:java:HashMap): 在冲突位置创建链表--->普通链表,平衡二叉树,红黑树
-再hash法:多个hash函数
-建立公共溢出区:将哈希表分为基本表和溢出表,将发生冲突的都存放在溢出表中