数据结构
- 格式:doc
- 大小:78.00 KB
- 文档页数:5
数据结构和算法到底有什么用?
数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排。数据结构包
括数组、链表、栈、二叉树、哈希表等等。算法对这些结构中的数据进行各种处
理。例如,查找一条特殊的数据项或对数据进行排序。
掌握这些知识以后可以解决哪些问题呢?
现实世界数据存储
程序员的工具
建模
数据结构的特性:
数组:优点是插入快,如果知道下标,可以非常快地存取。缺点是查找慢,删除
慢,大小固定。
有序数组:优点是比无序的数据查找快。缺点是删除和插入慢,大小固定。
哈希表:优点是如果关键字已知则存取极快。插入快。缺点是删除慢,如果不知
道关键字则存取很慢,对存储空间使用不充分。
链表:优点是插入快,删除快。缺点是查找慢。
堆:优点是插入、删除快,对最大数据项的存取很快。缺点是对其他数据项存取
慢。
栈:优点是提供后进先出方式的存取。缺点是存取其他项很慢。
队列:提供先进先出方式的存取。缺点是存取其他项很慢。
二叉树:优点是查找、插入、删除都快(如果树保持平衡)。缺点是删除算法复
杂。
红-黑树:查找、插入、删除都快。树总是平衡的。缺点是算法复杂。
2-3-4树:优点是查找、插入、删除都快。树总是平衡的。类似的树对磁盘存储
有用。缺点是算法复杂。
图:优点是对现实世界建模。缺点是有些算法且复杂。
对于大多数数据结构来说,都需要知道如何插入一条新的数据项,如何寻找某一
特定的数据项,如何删除某一特定的数据项,还需要知道如何迭代地访问某一数
据结构中的各数据项,以便进行显示或其他操作。另一种重要的算法范畴是排序。
一、通用数据结构:数组,链表,树,哈希表
它们被称之为通用的数据结构是因为它们通过关键字的值来存储并查找数据,这
一点在通用数据库程序中常见到(栈等特殊结构正好相反,它们只允许存取一定
的数据项)。
通用数据结构可以完全按照速度的快慢来分类:
数组和链表是最慢的,树相对较快,哈希表是最快的。
但并不是使用最快的结构永远是最好的方案。这些最快的结构也有缺陷,首先,
它们的程序在不同程度上比数组和链表的复杂;其次,哈希表要求预先知道要 存
储多少数据,数据对存储空间的利用率也不是非常高。普通的二叉树对顺序的数
据来说,会变成缓慢的O(N)级操作;而平衡树虽然避免了上述的问题,但是它 的
程序编制起来却比较困难。
数组在下列情况下很有用:
数据量较小
数据量的大小事先可预测
如果存储空间足够大的话,可以放松第二条,创建一个足够大的数组来应付所有
可以预见的数据输入。
如果插入速度很重要的话,使用无序数组。如果查找速度很重要的话,使用有序
数组,并用二分查找。数组元素的删除总是很慢,这是由于为了填充空出来的单
元,平均半数以上的数组元素要被移动。在有序数组中的遍历是很快的,而在无
序的数组不支持这种功能。
向量(如Java中的向量类)是一种当数据太满时可以自己扩充空间的数组。向
量可以应用于数据量不可预知的情况下。然而,在向量扩充时,要将旧的数据拷
入一个新的空间中,这一过程会造成程序明显的周期性暂停。
如果需要存储的数据量不能预知或者需要频繁地插入删除数据元素时,考虑使用
链表。当有新的元素加入时,链表就开辟新的所需要的空间,所以它甚至可以占
满全部可用内存;在删除过程中没有必要像数组那样添补“空洞”。
二、专用数据结构:栈,队列,优先级队列
三、排序:插入排序,希尔排序,快速排序,归并排序,堆排序
四、图:邻接矩阵,邻接表
五、外部存储:顺序存储,索引文件,B-树,哈希方法
在程序中,存放指定的数据最常用的数据结构有两种:数组和链表。
数组和链表的区别:
1、数组是将元素在内存中连续存放。
链表中的元素在内存中不是顺序存储的,而是通过存在
元素中的指针联系到一起。
2、数组必须事先定义固定的长度,不能适应数据动态地增减的情况。
当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
链表动态地进行存储分配,可以适应数据动态地增减的
情况。
3、(静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度
小。
链表从堆中分配空间, 自由度大但是申请管理比较麻烦。
数组和链表在存储数据方面到底孰优孰劣呢?根据数组和链表的特性,分两
类情况讨论。
一、当进行数据查询时,数组可以直接通过下标迅速访问数组中的元素。而
链表则需要从第一个元素开始一直找到需要的元素位置,显然,数组的查询效率
会比链表的高。
二、当进行增加或删除元素时,在数组中增加一个元素,需要移动大量元 素,
在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样,如果想删
除一个元素,需要移动大量元素去填掉被移动的元素。而链表只需改动元素中的
指针即可实现增加或删除元素。
那么,我们开始思考:有什么方式既能够具备数组的快速查询的优点又能融
合链表方便快捷的增加删除元素的优势?HASH呼之欲出。
所谓的hash,简单的说就是散列,即将输入的数据通过hash函数得到一个
key值,输入的数据存储到数组中下标为key值的数组单元中去。
我们发现,不相同的数据通过hash函数得到相同的key值。这时候,就产
生了hash冲 突。解决hash冲突的方式有两种。一种是挂链式,也叫拉链法。
挂链式的思想在产生冲突的hash地址指向一个链表,将具有相同的key值的数
据存放到链 表中。另一种是建立一个公共溢出区。将所有产生冲突的数据都存
放到公共溢出区,也可以使问题解决。
如何实现hash的动态增加空间的效果?这和装在因子密切相关。装填因子
= 填入表中的元素个数 / 散列表的长度。当装填因子达到一定值a时,我们就
让数组增加一定的内存空间,同时rehash。
下面用两个示例来加深理解。
示例一:用链表实现队列
节点类