Logo
Section 1 / 2

线性与非线性数据结构概述

在本节课中,我们将回顾已学习的所有数据结构的时间复杂度,并将它们分类为线性数据结构和非线性数据结构。

导入

线性与非线性数据结构概述

在本节课中,我们将回顾已学习的所有数据结构的时间复杂度,并将它们分类为线性数据结构和非线性数据结构。

在学习了所有常见的数据结构之后,我们来看看哪些是线性结构,哪些是非线性结构。这些信息在为算法选择合适的数据结构时非常有用。

线性数据结构

在线性数据结构中,每个元素最多连接一个(下一个元素)或两个(前一个和后一个)其他元素。这类结构的遍历方式是线性的,因此插入、删除和查找操作的时间复杂度通常为 O(n)。

数组、链表、栈 和 队列 都属于线性数据结构。

非线性数据结构

非线性数据结构与线性结构正好相反。在非线性结构中,每个元素可以连接多个其他元素。遍历过程不是线性的,因此查找、插入和删除操作可以在 O(log n) 甚至 O(1) 时间内完成。

树、图 和 哈希表 都是非线性数据结构。

时间与空间复杂度速查表

以下是本课程所学各种数据结构各项操作的时间和空间复杂度总结,有助于你在不同场景下比较它们的性能表现。

说明:表中 n 表示结构中存储的元素总数。

数据结构插入删除查找空间复杂度
数组O(n)O(n)O(n)O(n)
单向链表O(1)(头插)O(1)(删除头节点)O(n)O(n)
双向链表O(1)(头插)O(1)(删除头节点)O(n)O(n)
双向链表(带尾指针)O(1)(头或尾插入)O(1)(头或尾删除)O(n)O(n)
栈O(1)(入栈)O(1)(出栈)O(n)O(n)
队列O(1)(入队)O(1)(出队)O(n)O(n)
二叉堆O(lg n)O(lg n)(removeMin())O(n)O(n)
二叉树O(n)O(n)O(n)O(n)
二叉搜索树O(n)O(n)O(n)O(n)
红黑树 / AVL树 / 2-3树O(lg n)O(lg n)O(lg n)O(n)
哈希表最坏 O(n),均摊 O(1)最坏 O(n),均摊 O(1)最坏 O(n),均摊 O(1)O(n)
Trie树(字母表大小:d,最长单词长度:n)O(n)O(n)O(n)O(d^n)

图的操作复杂度

对于包含 n 个顶点和 m 条边的图,一些常见操作的时间复杂度如下:

操作邻接表邻接矩阵
添加顶点O(1)O(1)
删除顶点O(m+n)O(n^2)
添加边O(1)O(1)
删除边O(n)O(1)
深度/广度优先搜索O(m+n)O(n^2)
空间复杂度O(m+n)O(n^2)

哈希表

结论