常见数据结构入门
时间空间复杂度:指最坏的执行次数
O(1):具有确定的运算次数
O(n):时间复杂度与n线性相关(一次函数)
O(logn):时间复杂度与n对数相关。一个例子是while循环,设x为执行次数,a^x=n,x=logn,执行次数最多为logn
线性表:均可以使用顺序存储、链表存储
元素序列,即元素之间存在一定的顺序,每个元素前后最多有一个元素。
线性表常用操作:
根据位置返回数字,根据数字返回位置或是否存在,i位置插入、删除元素,返回线性表长度,排序等
线性表顺序存储
插入,删除极为不便
线性表链表存储
单链表:
头指针指向第一个节点的地址,此后每个节点包括数据域与指针域(存放下一个节点的地址)
静态链表。。
循环链表:尾指针指向第一个元素的地址。
双向链表。。
栈:先进后出
仅在表位进行插入删除的线性表
栈与函数以及递归。函数互相调用就使用的栈结构。同时栈适合后退,撤销操作。
两栈共享空间:
第一个栈底为0,第二个栈栈底为n-1,入栈时两者分别向中间靠拢。
栈可以用顺序结构或链式结构存储。
常用push、pop方法
队列:先进先出
只允许在一段执行插入操作,另一端执行删除操作。
使用场景包括各种请求,键盘输入,数据流等。
确定队列长度时使用顺序队列,否则使用链队列。
(字符)串
一般采取顺序存储。
常用方法:查找,替换,插入,删除,转大小写
树
树由一个根节点和若干子树构成,树的节点具有相同的数据类型与层次关系。
节点的双亲(树结构父母同体,只有一个节点)
根节点:无双亲,唯一
叶节点:无孩子,多个
中间节点:一个双亲多个孩子
数据结构表示法,关于树的表示方法,一般的,对于某种算法,查找某种信息方便势必使得查找另一种信息困难,空间复杂度与时间复杂度又是可以互换的,因此核心在于要充分利用结合顺序存储与链表存储的结构,更重要的是优秀的算法与设计思想。
孩子表示法:找双亲麻烦
双亲表示法:找孩子麻烦
孩子兄弟表示法:
节点结构三部分:数据域,长子域,兄弟域。
此种方法将一棵树变成了二叉树。
二叉树
斜二叉树:
完全二叉树:除了叶子节点,其他分支节点都有左右子树,
满二叉树:除了叶子节点,其他分支节点都有左右子树,且所有叶子在同一层。
二叉树在第i层至多有2(i-1)个节点。深度为k的二叉树至多有2k-1个节点。
二叉树的顺序存储:由于严格的定义使得可以由顺序结构表示。节点的下标由节点在树的位置从上往下从左往右顺序增加。
二叉树的链表存储:结构由三部分组成,分别是数据域,左孩子地址,右孩子地址。需要的话,可以再增加一部分写入双亲的地址。
二叉树的遍历
从根节点按某种次序访问所有节点一次。左节点,右节点,父节点是相对的概念。
前序遍历:前序遍历左节点,
中序遍历:中序遍历父节点。
后序遍历:后序遍历右子树
层序遍历:
二叉树的建立
利用递归的思想
森林,树,二叉树的转换
将树转换成二叉树方便处理。
赫夫曼树:带权路径长度最小的二叉树
图
查找
顺序表查找:效率低
有序表查找:折半,插值。斐波那契。效率较快。
线性索引查找:
索引技术是组织大型数据库以及磁盘文件的一种技术要求。索引就是把一个关键字与他的对应记录想关联的过程。索引项应该包含关键字与对应记录在存储器中的位置信息。这里介绍线性索引。
稠密索引:每个记录对应一个索引,且索引项要按照关键码有序排列,索引(关键字)有序在查找关键字时可以用到顺序查找法,
首先将查找集合组织成表,树的结构。使用二叉排序树,散列表进行查找。
分块索引:对数据集分块,使其分块有序。此时块内无序(为了使得插入删除方便,降低查找效率),可以利用顺序查找。块间有序,利用有序查找。
倒排索引:搜索引擎涉及的技术
一般的查找时根据关键字查找属性/记录,搜索引擎则是根据内容/属性/记录查找关键字(或文章)的地址/连接。
倒排记录表每一项记录的是内容与该内容对应的文章链接。
中文检索时还要根据输入内容关联已分类内容。。
树查找
二叉排序树/二叉查找树:
中序遍历得到有序列表。删除元素时,需要找到合适的节点(和原节点元素差最小)替换原节点。
但是一组数字可以构建多个二叉排序树,查找效率不一。
平衡二叉树:
要求二叉排序树左子树与右子树高度差距至多为一,这样就能保证最大的查找效率。
构建平衡二叉树很麻烦,不满足平衡条件时需要对某些部分进行旋转操作。一个重要的概念是平衡因子BF(左子树深度减去右子树深度),BF为-1,0,1是正常的。旋转时,有时还需变动原先的节点避免节点出现三个孩子。
多路查找树
每个节点的孩子多于两个,节点的元素可为多个
2-3树:节点有一个元素,有两个或三个孩子。
B树:平衡的多路查找树。
B+树:。。
散列表(哈希表)查找
之前的查找是先找到key的索引,利用事先建立的key-value表,通过key中value的地址找到value。
散列表利用散列函数计算key的散列地址,并按照这个地址存储value。散列技术既是存储技术,又是查找技术。
散列地址与内存地址???
散列函数的构造:
理想情况下,一个key对应一个value。但是常常会出现key不同value不同的情况,因此设计时要考虑避免以及解决这个冲突。
散列函数应计算简单,散列地址应该分布均匀。有以下几种方法:
直接定址法:
散列函数为一次函数。
数字分析法:
平方取中:适合不知道关键字分布时。
折叠法:
除留余数法:取模
key 模 p 。如111 mod 5。
随机数法:
处理散列冲突的方法
开放定址法:
再散列函数:
冲突后使用多种散列函数。
链地址法:
冲突后,将不同key同样value值的数存储在一个链表中;
公共溢出表法:
将所有冲突的放在一张表中,适合少量冲突的时候。
排序
__EOF__

本文链接:https://www.cnblogs.com/killens/p/16303699.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!