数据结构(一)

数据结构分类

(1)线性数据结构:元素之间一般存在元素之间存在一对一关系,是最常用的一类数据结构,典型的有:数组、栈、队列和线性表
(2)树形结构:结点间具有层次关系,每一层的一个结点能且只能和上一层的一个结点相关,但同时可以和下一层的多个结点相关,称为“一对多”关系,常见类型有:树、堆
(3)图形结构:在图形结构中,允许多个结点之间相关,称为“多对多”关系

线性数据结构

数组和链表

a、数组

存放着一组相同类型的数据,需要预先指定数组的长度,有一维数组、二维数组、多维数组等

b、链表

链表是C语言中一种应用广泛的结构,它采用动态分配内存的形式实现,用一组任意的存储单元存放数据元素链表的,一般为每个元素增设指针域,用来指向后继元素

从逻辑结构来看:数组必须事先定义固定的长度,不能适应数据动态地增减的情况;链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项(数组中插入、删除数据项时,需要移动其它数据项)
从内存存储来看:(静态)数组从栈中分配空间(用NEW创建的在堆中), 对于程序员方便快速,但是自由度小;链表从堆中分配空间, 自由度大但是申请管理比较麻烦
从访问方式来看:数组在内存中是连续存储的,因此,可以利用下标索引进行随机访问;链表是链式存储结构,在访问元素的时候只能通过线性的方式由前到后顺序访问,所以访问效率比数组要低

栈、队列、线性表

a、栈

只允许在序列末端进行操作,栈的操作只能在栈顶进行,一般栈又被称为先进后出的线性结构

b、队列

只允许在序列两端进行操作,一端进,一端出,一般队列也被称为先进先出的线性结构

c、线性表

允许在序列任意位置进行操作,线性表的操作位置不受限制,线性表的操作十分灵活,常用操作包括在任意位置插入和删除,以及查询和修改任意位置的元素
 线性表两种存储结构的比较:
 1)顺序表:
 优点:在顺序表中,逻辑中相邻的两个元素在物理位置上也相邻,查找比较方便,存取任一元素的时间复杂度都为O(1)
 缺点:不适合在任意位置插入、删除元素,因为需要移动元素,平均时间复杂度为O(n)
 2)链表:
 优点:在链接的任意位置插入或删除元素只需修改相应指针,不需要移动元素;按需动态分配,不需要按最大需求预先分配一块连续空空
 缺点:查找不方便,查找某一元素需要从头指针出发沿指针域查找,因此平均时间复杂度为O(n)

树形结构

结点间具有层次关系,每一层的一个结点能且只能和上一层的一个结点相关,但同时可以和下一层的多个结点相关,称为“一对多”关系,常见类型有:树、堆。
(1)二叉树:二叉树是一种递归数据结构,是含有n(n>=0)个结点的有限集合,二叉树具有以下特点:
二叉树可以是空树;二叉树的每个结点都恰好有两棵子树,其中一个或两个可能为空;二叉树中每个结点的左、右子树的位置不能颠倒,若改变两者的位置,就成为另一棵二叉树
(2)满二叉树:除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树,高度为h,由2^h-1个节点构成的二叉树称为满二叉树。
(3)完全二叉树:完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
(4)平衡二叉树:树的左右子树的高度差不超过1的数,空树也是平衡二叉树的一种。
(5)红黑树:

  1. 每个结点要么是红的要么是黑的。
  2. 根结点是黑的。
  3. 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
  4. 如果一个结点是红的,那么它的两个儿子都是黑的。
  5. 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。

数的左旋和右旋。
1 左旋

在这里插入图片描述
如上图所示,当在某个结点pivot上,做左旋操作时,我们假设它的右孩子y不是NIL[T],pivot可以为任何不是NIL[T]的左子结点。左旋以pivot到Y之间的链为“支轴”进行,它使Y成为该子树的新根,而Y的左孩子b则成为pivot的右孩子。

2 右旋
和上述图相反
树在经过左旋右旋之后,树的搜索性质保持不变,但树的红黑性质则被破坏了,所以,红黑树插入和删除数据后,需要利用旋转与颜色重涂来重新恢复树的红黑性质。

(6)堆:堆是具有以下特性的完全二叉树,其所有非叶子结点均不大于(或不小于)其左右孩子结点。若堆中所有非叶子结点均不大于其左右孩子结点,则称为小顶堆(小根堆),若堆中所有非叶子结点均不小于其左右孩子结点,则称为大顶堆(大根堆)
(7)b树(只有一次,每个节点都有数据) ,b+树(为磁盘存储专门定制,只在叶子结点有数据)

图形结构

在图形结构中,允许多个结点之间相关,称为“多对多”关系,可分为有向图和无向图

常见的数据类型

HashMap
1.8之前底层使用数组加链表,1.8及之后当链表的长度超过8会变成红黑树。

  1. 扩容因子0.75
    当为1时会加大hsah碰撞的概率,当为0.5时会浪费内存且命中率太低,根据泊松分布设置为0.75
  2. 扩容每次都是两倍
    hash & (n - 1)其中 n 等于 2 的k次方
    原理 :求模运算(hash%n)可以看成hash右移k位然后取后k位
    11110 >>3 = 11[除数] 110[余数]
    ==> 11110 = 30 11 = 3 110 = 6 除数 8 32%8=3…4
    n-1转化成2进制 个位上的值全部都是1
    此时再使用&得到了hash的后k位,及余数。(n必须为2的k次方)
    例子:
    11110 [32] & 111[7] = 110
  3. 初始值容量16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值