比较总结线性表的几种主要存储结果
2017-10-09 14:59
295 查看
线性表是一种最基本、简单的数据结构,数据元素之间仅具有单一的前驱和后继关系,是具有相同类型的数据元素的有限序列。在刚接触数据结构时候,学习了线性表的六种存储结构,分别是顺序表、单链表、循环链表、双链表、静态链表和间接寻址。下面就一一总结一下吧。
顺序表
顺序表是用一段地址连续的存储单元依次存储线性表的数据元素。类型相同和连续的存储单位,这些都是数组的特点,所以通常使用一维数组来实现顺序表。
优点:
(1)存储密度高;
(2)可以随机存取结点。
缺点:
(1)长度为定值,中途无法扩充;
(2)插入删除需要移动结点,效率低。
(3)数组要求占用连续的存储空间,会造成存储空间的“碎片”。
单链表
单链表是用一组任意的存储单元存放线性表的元素,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存的任意位置。在实现的过程中,每个存储单元在存储数据元素的同时,还必须存储其后继元素所在的地址信息,这个地址信息称为指针。
优点:
(1)插入删除不需要移动结点,效率高;
(2)动态申请内存,充分利用内存,不会造成存储空间的“碎片”。
缺点:
(1)查找和存取元素需要多次操作指针来遍历和连接链表,效率低。
循环链表
在单链表中,将终端结点的指针域由空指针改为指向头结点,使整个单链表形成一个环,这种头尾相接的单链表称为循环链表。
优点:
(1)从循环链表中任意结点出发。课扫描到其他结点,增加了链表操作的灵活性。
缺点:
(1)循环链表中没有明显的尾端,可能会使循环链表的处理操作进入死循环,需要格外注意循环条件。
双链表
在单链表的每个结点中再设置一个指向其前驱结点的指针域,这样就形成了双链表。实际应用中常采用带头结点的循环双链表。
优点:
(1)相比单链表,可以直接访问前一个结点。
缺点:
(1)相比单链表,多了一个前驱指针域,在操作上变复杂了。
(2)相比单链表,多了一个前驱指针域,加大了在结构上的内存开销。
静态链表
静态链表是用数组来表示单链表,用数组元素的下标来模拟单链表的指针。
优点:
(1)插入和删除元素时,不需要移动元素,效率高。
缺点:
(1)没有解决连续存储分配带来的表长难以确定的问题。
间接寻址
间接寻址是将数组和指针结合起来的一种方法,它将数组中存储数据元素的单元改为存储指向该元素的指针。
优点:
(1)保持了顺序表随机存取的优点;
(2)改进了插入和删除操作的时间性能。
缺点:
(1)没有解决连续存储分配带来的表长难以确定的问题。
总结:
六种存储结构各有各的优势,也各有各的劣势。
利用指针动态申请内存的(如单链表、循环链表、双链表),可以充分利用内存空间,也不需要去考虑表长的确定问题(表长最大就是所有能用的内存了),但是在存取数据操作比较多,相比而言循环链表和双链表在存取方面比单链表要灵活,但是它们的结构在内存上的开支比单链表要大。就是牺牲了结构的开支,提高了一下遍历的性能。
利用到数组来实现的(如顺序表、静态链表、间接寻址),在存取方面上十分方便快捷,但是依旧没有解决连续存储分配带来的表长难以确定的问题,会造成存储空间的“碎片”。静态链表和间接寻址,两者都是综合了数组和指针的概念的方法。
静态链表在插入和删除元素时候,模拟了链表的解决方法,不需要移动元素。这比顺序表的效率高了不少,但静态链表在结构上多了一个模拟指针的元素,在结构上内存的开支大了。有许多编程语言没有指针,这可能就是静态链表存在的其中一个原因吧。
间接寻址在插入和删除操作的时候和顺序表貌似差不多,与其不同的是,间接寻址移动的不是元素而是指向元素的指针。虽然该算法的时间复杂度仍为O(n),但当元素占用的空间较大时,间接寻址比顺序表的插入删除的移动操作快得多。
一轮的分析过后,在实际操作中应该按照实际来确定使用那种结构来存储。比如在查询操作使用的比较频繁时,使用顺序表会好一些;在插入、删除操作使用的比较频繁时,使用单链表会好一些。总的来说就是要尽可能的发挥出每一种线性表的优点,这样写出来的程序性能就会有所提升了吧。
不难发现,大部分的线性表都是根据顺序表和单链表改良的,所以顺序表和单链表必须多加练习了。
这里总结的篇幅不多,有错漏,请大家在评论留言一下,共同进步。(‾^‾)ง⁼³₌₃
新世界的大门 (๑•̀ㅂ•́)و✧
顺序表
顺序表是用一段地址连续的存储单元依次存储线性表的数据元素。类型相同和连续的存储单位,这些都是数组的特点,所以通常使用一维数组来实现顺序表。
优点:
(1)存储密度高;
(2)可以随机存取结点。
缺点:
(1)长度为定值,中途无法扩充;
(2)插入删除需要移动结点,效率低。
(3)数组要求占用连续的存储空间,会造成存储空间的“碎片”。
单链表
单链表是用一组任意的存储单元存放线性表的元素,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存的任意位置。在实现的过程中,每个存储单元在存储数据元素的同时,还必须存储其后继元素所在的地址信息,这个地址信息称为指针。
优点:
(1)插入删除不需要移动结点,效率高;
(2)动态申请内存,充分利用内存,不会造成存储空间的“碎片”。
缺点:
(1)查找和存取元素需要多次操作指针来遍历和连接链表,效率低。
循环链表
在单链表中,将终端结点的指针域由空指针改为指向头结点,使整个单链表形成一个环,这种头尾相接的单链表称为循环链表。
优点:
(1)从循环链表中任意结点出发。课扫描到其他结点,增加了链表操作的灵活性。
缺点:
(1)循环链表中没有明显的尾端,可能会使循环链表的处理操作进入死循环,需要格外注意循环条件。
双链表
在单链表的每个结点中再设置一个指向其前驱结点的指针域,这样就形成了双链表。实际应用中常采用带头结点的循环双链表。
优点:
(1)相比单链表,可以直接访问前一个结点。
缺点:
(1)相比单链表,多了一个前驱指针域,在操作上变复杂了。
(2)相比单链表,多了一个前驱指针域,加大了在结构上的内存开销。
静态链表
静态链表是用数组来表示单链表,用数组元素的下标来模拟单链表的指针。
优点:
(1)插入和删除元素时,不需要移动元素,效率高。
缺点:
(1)没有解决连续存储分配带来的表长难以确定的问题。
间接寻址
间接寻址是将数组和指针结合起来的一种方法,它将数组中存储数据元素的单元改为存储指向该元素的指针。
优点:
(1)保持了顺序表随机存取的优点;
(2)改进了插入和删除操作的时间性能。
缺点:
(1)没有解决连续存储分配带来的表长难以确定的问题。
总结:
六种存储结构各有各的优势,也各有各的劣势。
利用指针动态申请内存的(如单链表、循环链表、双链表),可以充分利用内存空间,也不需要去考虑表长的确定问题(表长最大就是所有能用的内存了),但是在存取数据操作比较多,相比而言循环链表和双链表在存取方面比单链表要灵活,但是它们的结构在内存上的开支比单链表要大。就是牺牲了结构的开支,提高了一下遍历的性能。
利用到数组来实现的(如顺序表、静态链表、间接寻址),在存取方面上十分方便快捷,但是依旧没有解决连续存储分配带来的表长难以确定的问题,会造成存储空间的“碎片”。静态链表和间接寻址,两者都是综合了数组和指针的概念的方法。
静态链表在插入和删除元素时候,模拟了链表的解决方法,不需要移动元素。这比顺序表的效率高了不少,但静态链表在结构上多了一个模拟指针的元素,在结构上内存的开支大了。有许多编程语言没有指针,这可能就是静态链表存在的其中一个原因吧。
间接寻址在插入和删除操作的时候和顺序表貌似差不多,与其不同的是,间接寻址移动的不是元素而是指向元素的指针。虽然该算法的时间复杂度仍为O(n),但当元素占用的空间较大时,间接寻址比顺序表的插入删除的移动操作快得多。
一轮的分析过后,在实际操作中应该按照实际来确定使用那种结构来存储。比如在查询操作使用的比较频繁时,使用顺序表会好一些;在插入、删除操作使用的比较频繁时,使用单链表会好一些。总的来说就是要尽可能的发挥出每一种线性表的优点,这样写出来的程序性能就会有所提升了吧。
不难发现,大部分的线性表都是根据顺序表和单链表改良的,所以顺序表和单链表必须多加练习了。
这里总结的篇幅不多,有错漏,请大家在评论留言一下,共同进步。(‾^‾)ง⁼³₌₃
新世界的大门 (๑•̀ㅂ•́)و✧
相关文章推荐
- 实验二 比较总结线性表的几种主要存储结果
- 比较总结线性表的几种主要存储结果
- 比较总结线性表的几种主要存储结果
- 比较总结线性表的几种主要存储结果
- 数据结构|比较总结线性表的几种主要存储结果
- 比较总结线性表的几种主要存储结果
- 《数据结构》实验二: 线性表综合实验——总结线性表的几种主要存储结果
- 《数据结构》实验二: 线性表综合实验——总结线性表的几种主要存储结果
- 实验二 线性表的几种主要存储结果
- 总结线性表的几种主要存储结构
- 实验二 总结线性表的几种主要存储方式
- 数据结构线性表的两种存储形式顺序表和单链表的比较
- Toast的常用封装(只是总结了几种比较简单的用法)
- 前端HTML5几种存储方式的总结
- Android中几种定时器的总结和比较
- perl脚本调用shell命令后的结果比较总结
- java集合遍历的几种方式总结及比较
- 前端HTML5几种存储方式的总结
- 主要几种通信协议的性能比较(转载)
- 几种查找算法总结与比较—顺序查找、有序查找、散列表查找