数据结构是计算机对磁盘的数据的一种安排。
数据结构包括:数组,链表,二叉树,栈,队列,哈希表等等。
数据结构的特性
数据结构 优点 缺点
———————————————————————————————————————————————
数组 如果知道下标可以快速的存取,查找 大小固定,删除慢
有序数组 比无序数组查找快 删除和插入慢,大小固定
栈 提供后进先出的方式存取 存取其他项慢
队列 提供先进先出的存取方式 存取其他项很慢
链表 插入快,删除快 查找慢
二叉树 查找,插入,删除都快 删除的算法复杂
为什么不用数组表示一切?
一个无序数组的插入数据很快但是查找却要花费很多的时间。在一个有序的数组中,虽然查找很快,但是插入需要花费时间,因为对于数组而言,插入要先寻找数据项要插入的合适的位置,而且会插入该项数据后,其他的数据都将往后移动。数组的另外的一个问题是数组一旦被new 出来以后,数组的大小就固定了,如果数组创建的空间过大,则会造成空间的浪费,如果创建的空间过小,会造成数组的溢出。vector类可以进行数组的扩容,扩容的办法是创建一个更大的数组,然后把之前的数据拷贝到这个新创建的数组空间中来,这样会导致效率很低。
数组的小结:
java 的数组是对象,需要new来创建
无序数组可以提供快速的插入,但是查找和删除都比较慢
有序的数组可以使用二分查找法
线性查找需要的时间与数组的数据项的个数成正比
二分查找需要的时间与数组中的数据项的个数的对数成正比
O(1)的算法是最好的,Olog(N) 次之,O(N)一般,O(N的平方)最差。
简单的排序:
冒泡排序:他是所有的排序算法中最简单的,因为他交换的次数比较多,所以不太适合数据比较多的时候,效率最差,但是最简单的排序。
选择排序:先选择数组中最小的数据项放在最最左面0的位置上,然后在从第1个开始比较选择最小的放在1位置上,效率略高于冒泡排序
插入排序:
二分法排序
以上的排序算法都是假定了数组的数据存储结构,当他们在排序的时候不需要耗费内存,只需要初始化的时候需要分陪内存(一直交互的是内存的地址的指向值而不是数据对象的本身),但是都需要一个临时的变量来存储交换位置时存储的值。
栈和队列
栈和队列都是为了简化程序的数据结构的。
在这些数据结构中只有一个数据项可以被访问
栈允许访问最后一个数据项
栈中重要的操作是在栈顶压入一个数据项,以及从栈定移除一个数据像项
队列只允许访问第一个插入的数据项
队列的重要操作是在队尾插入一个数据项在队头移除一个数据项
队列可以实现为循环的队列,他基于数组,数组的数字下标,可以从数组的末端回绕到数组的开始位置这些数据的结构可以用数组来实现也可以其他的机制实现,例如链表结构。
二叉树:他结合了另外两种数据结构的优点:一种是有序数组,另一种是链表。
根节点没有父节点,二叉树中节点最多有两个子节点,二叉树中,所有的a节点的左边的节点的关键字都比a小,所有的右边子孙节点的关键字的值都比a大
删除节点是二叉树中最复杂的
二叉树中查找最小值非常的轻而易举,先走到根节点,然后走根节点的左子节点,直到找到一个没有左子节点的节点,这个节点就是最小值。
哈希表:是一种数据结构,它可以提供快速的插入操作和查找操作,
缺点:它是基于数组的,数组创建以后难于扩展,某些哈希表被基本填满的时候性能会下降的十分严重。
链表:链表结构中一个链接点包含一个数据域和指向下一个节点的地址域(next)next 为空表示已经到链表的结尾,在查找的时候是根据这种链表的关系一个个查找的,链表分为单链表和双向链表.
双向链表是指链接点中既包括了数据域还包括了前一个连接点和下一个链接点的地址域,这样既可以向后查找,又可以反向向前查找