前言
数据结构应该是和日常的业务代码密切不可分的, 每个人都应该接触过, 但是真正去了解或研究的人很少, 今天就给大家介绍和对比一下常用数据结构.
时间复杂度对比
Data Structure | Add | Find | Delete | GetByIndex |
Array (T[]) | O(n) |
O(n) |
O(n) |
O(1) |
Linked list (LinkedList) |
O(1) |
O(n) |
O(n) |
O(n) |
Resizable array list (List) |
O(1) |
O(n) |
O(n) |
O(1) |
Stack (Stack) |
O(1) |
- |
O(1) |
- |
Queue (Queue) |
O(1) |
- |
O(1) |
- |
Hash table (Dictionary) |
O(1) |
O(1) |
O(1) |
- |
Tree-based dictionary (SortedDictionary) |
O(log n) |
O(log n) |
O(log n) |
- |
Hash table based set (HashSet) |
O(1) |
O(1) |
O(1) |
- |
Tree based set (SortedSet) |
O(log n) |
O(log n) |
O(log n) |
- |
如何选择数据结构
Array (T[]): 当元素的数量是固定的,并且需要使用下标时。
Linked list (LinkedList): 当元素需要能够在列表的两端添加时。否则使用 List。
Resizable array list (List): 当元素的数量不是固定的,并且需要使用下标时。
Stack (Stack): 当需要实现 LIFO(Last In First Out)时。
Queue (Queue): 当需要实现 FIFO(First In First Out)时。
Hash table (Dictionary): 当需要使用键值对(Key-Value)来快速添加和查找,并且元素没有特定的顺序时。
Tree-based dictionary (SortedDictionary)当需要使用价值对(Key-Value)来快速添加和查找,并且元素根据 Key 来排序时。
Hash table based set (HashSet)当需要保存一组唯一的值,并且元素没有特定顺序时。
Tree based set (SortedSet)当需要保存一组唯一的值,并且元素需要排序时。
Array
在计算机程序设计中,数组(Array)是最简单的而且应用最广泛的数据结构之一。在任何编程语言中,数组都有一些共性:
数组中的内容是使用连续的内存(Contiguous Memory)来存储的。
数组中的所有元素必须是相同的类型,或者类型的衍生类型。因此数组又被认为是同质数据结构(Homegeneous Data Structures)。
数组的元素可以直接被访问。比如你需要访问数组的第 i 个元素,则可以直接使用 arrayName[i] 来访问。
对于数组的常规操作包括:
分配空间(Allocation)
数据访问(Accessing)
在 C# 中,可以通过如下的方式声明数组变量。
int allocationSize = 10;bool[] booleanArray = new bool[allocationSize];FileInfo[] fileInfoArray = new FileInfo[allocationSize];
上面的代码将在 CLR 托管堆中分配一块连续的内存空间,用以容纳数量为 allocationSize ,类型为 arrayType 的数组元素。如果 arrayType 为值类型,则将会有 allocationSize 个未封箱(unboxed)的 arrayType 值被创建。如果 arrayType 为引用类型,则将会有 allocationSize 个 arrayType 类型的引用被创建。