数据元素之间的相互关系称为结构。
数据结构的本质:如何将现实世界中的各种各样的数据放入内存中,并且如何在内存中操作这些数据,如何评价这些存储方案和操作方法。
将现实世界的数据组织成逻辑结构,再把逻辑结构的数据映射到物理结构(比如链表是逻辑线性,物理不连续)。
数据类型指的是一组值和一组对这些值得操作的集合。是组织信息的一种自然方式。
每当遇到逻辑上相关的不同类型的数据时,定义一个抽象数据类型。
抽象数据类型(ADT):一种能够对使用者隐藏数据表示的数据类型。(如用java类实现抽象数据类型,用一组静态方法实现一个函数库)
通用数据结构:数组、链表、数、哈希表。(通过关键字的值来存储并查找数据)
专用数据结构:栈、队列、优先级队列。
排序:插入排序、希尔排序、快速排序、归并排序、堆排序。
图:邻接矩阵、邻接表
外部存储:顺序存储、索引文件、B-树、哈希方法
数组:数据量较小,数据量的大小可预测。
链表:存储数据量不能预知或需要频繁地插入删除数据元素。
二叉搜索树: 提供快速的O(logN)级的插入、查找和删除。遍历的时间复杂度为O(N)。如果可以保证数据是随机输入的,就不需要平衡二叉树。有序遍历、最大最小值提取。
平衡树:红黑树和2-3-4树。不论输入是否有序,都能保证性能为O(logN)。
哈希表:速度最快,以数组作为基本数据结构。所以,必须预先精确地知道存储的数据量。
数据结构 | 查找 | 插入 | 删除 | 遍历 |
数组 | O(N) | O(1) | O(N) | - |
有序数组 | O(logN) | O(N) | O(N) | O(N) |
链表 | O(N) | O(1) | O(N) | - |
有序链表 | O(N) | O(N) | O(N) | O(N) |
二叉树(一般情况) | O(logN) | O(logN) | O(logN) | O(N) |
二叉树(最坏情况) | O(N) | O(N) | O(N) | O(N) |
平衡树(一般和最坏情况) | O(logN) | O(logN) | O(logN) | O(N) |
哈希表 | O(1) | O(1) | O(1) | - |