数据结构与算法的应用场景

1. 概述

数据结构与算法可以按以下类别分类:

通用数据结构:数组、链表、树、哈希表
专用数据结构:栈、队列、优先级队列
排序:插入排序、希尔排序、快速排序、归并排序、堆排序
图:邻接矩阵、邻接表
外部存储:顺序存储、索引文件、B-树、哈希方法


2. 通用数据结构应用场景

数组和链表是最慢的,树相对较快,哈希表是最快的。

但是并非使用最快的结构是最好的方案,因为最快的结构也有缺陷。
(1)实现起来比数组和链表复杂;
(2)哈希表需要预先知道要存储多少数据,对存储空间的利用率也不是非常高;
(3)普通的二叉树对于顺序的数据来说,会变成缓慢的O(N)级操作;平衡树虽然避免了上述问题,但是程序实现比较困难。

链表:数据量小、数据量不可预知
有序数组:数据量小、数据量可预知、查找速度比插入速度更重要
无序数组:数据量小、数据量可预知、插入速度比查找速度更重要
哈希表:数据量大、查找和插入的速度必须很快
二叉查找树:数据量大、查找和插入的速度不要求很快、关键字随机分布
平衡树:数据量大、查找和插入的速度不要求很快、关键字顺序分布

3. 专用数据结构的应用场景

栈、队列、优先级队列是抽象数据类型(ADT)。

栈用在只对最后被插入的数据项访问的时候,它是一个后进先出(LIFO)结构。栈可以通过数组或链表实现。如果数据量较小且可以预知则使用数组实现,如果数据量较大且不可预知则用链表实现。

队用在只对最先被插入的数据项访问的时候,它是一个先进先出(FIFO)的结构。队可以通过数组或链表实现。如果数据量较小且可以预知则使用数组实现,如果数据量较大且不可预知则用双端链表实现。

优先级队列用在只对访问最高优先级数据项的时候,最高优先级数据项就是包含最大(最小)的关键字的项。优先级队列可以用有序数组或堆来实现。向有序数组中插入是很慢的,但是删除很快。使用堆来实现优先级队列,插入和删除的时间复杂度都是O(logN)级。当插入速度不重要时,可以是要数组或者双端链表。

4. 排序

选择排序算法时,可以先选择一种较慢但简单的排序,例如插入排序。在数据量少于1000为宜。
如果插入排序太慢,下一步可以考虑希尔排序。在数据量少于5000为宜。
只有当希尔排序变得很慢时,才考虑归并排序、堆排序或者快速排序。
归并排序需要辅助存储空间,堆排序需要一个堆的数据结构,前两者都比快速排序在某些程度上慢,所以当需要在最短的排序时间时经常选择快速排序。
然而快速排序在处理非随机性数据时性能可能蜕化至O(N^2)。
对于非随机性的数据来说,堆排序更加可靠。

5. 图

图并不存储通用数据,也并不会在其他算法中成为工具,正相反,它们直接模拟现实世界中的情况。
稠密的图用邻接矩阵,稀疏的图用邻接表。

你可能感兴趣的:(数据结构与算法)