数组与链表
数组和链表是两种数据结构,数组非常简单易用但他有两个非常大的缺点,一个是数组一旦创建无法扩展,另一个数组的查找和删除很慢。
链表改善了一些数组的缺点,但是同样的链表自身也存在一些自己的缺点
大0表示法,一种粗略的评价计算机效率的方法,后面的内容会用到表示效率的方法
#1.数组
我们按照数组中的数组是否排序对数组进行划分,将数组分为无序数组和有序数组,无序数组中的数组是无序的,有序数组中是按照升序+降序排序的
##1.1无序数组
无序数组中的数据是无序的,往数组中添加时不用进行比较和移动数据,所以添加数据的时间相同,效率为0(1)
至于查找和删除就没有那么快了 效率O(N)
结论:
1.插入很快,因为将数据插入到数组的空余位置
2.查找和删除很慢 ,数组长度为n,平均查找速度是N/2 并且还需要移动数据
##1.2有序数组
无序数组里面无序 有序数组里面是有序的
因为有序数组中数据升降排列,所以插入需要进行排序并且移动数据项 所以查找比无序数组慢 删除一样慢 O(N)
有序数组的查找速度要比无序数组快,因为使用了一个叫二分查找法
折半查找
有序数组使用二分查找的效率为 0(logn) 有序数组也可以二分查找来新增和删除数据来提高效率,但依旧 新增删除侯移动数据项
总结:1. 有序查找比无序高 效率O(logn)
2.有序数组删除和新增的效率很慢 O(N)
##1.3数组 总结
数组虽然简单 但有两个致命的缺点
1.数组的存储数量有限,创建大了浪费,创建小了过溢
2.数组的效率比其他数据结构低
*无序数组插入效率为o(1)时间 插入0(n)
* 有序数组查o(logn)时间,插入花费O(N)时间
*删除需要移动平均半数的数据项,所以删除都是O(n)时间
#2.链表
数组一经创建大小就固定,链表做出了需改,只要内存够用就可以无限制扩大
链表是数组之后应用最广泛的数据结构
##2.1 链表的特点
链表 保存数据的方式就像一条锁链
每一个锁链一个节点 调用next()方法可以遍历链表所有数据
链节点 link中,一个链结点是某一个类的对象,这个类可以叫做LINK,因为链表中有好多的类,所以要不同于链表的类来表达链接点
每一个Link对象都包含一个对下一个链接点引用的字段 叫做next
链表本身对象有一个字段指向对第一个链接点的引用
数组与链表查找数据得区别:数组查找就像一个大仓库,一号房间没有,下一个,找完所有房间就行
链表中查找数据就像单线汇报的工作者,一个传递一个 最终完成
###2.4 其他链表
单向链表,只能从后往前遍历 还有双端链表 双向链表,有序链表
双端链表:单向的基础上,新增一个成员变量指向链表的最后一个对象
双向链表是可以从 first和last两个方向进行遍历
##链表的效率
链表的效率
在表头插入和删除速度都很快,花费 O(1)
平均起来,查找和删除 在指定链接点侯都需要O(n)次比较,虽然数组也需要,但是链表更快一些 不需要移动数据项(只需要改变引用)
#3.总结
链表解决了数组不能解决扩展的问题,但是链表自身依然存在一些问题(在链表的链接点后面查找&删除&插入效率不高),那么有没有融合了优点又改变了缺点的呢 那就是
二叉树。下一篇介绍二叉树。