一、基本概念
数据结构即数据元素相互之间存在的一种和多种特定的关系集合,在计算机中是存储、组织数据的方式。通俗的讲:数据结构 = 逻辑结构 + 存储结构。
Tips:各编程语言都有内建的数据结构,而他们又都有不同之处(后续会讲到)。
数据结构是数据的表现形式,在了解数据结构之前,我们先来了解数据,那么什么是数据?数据一般由数据项、数据元素、数据对象组成,用简单的公式来表示即为:
- 数据 = N * 数据对象
- 数据对象 = N * 数据元素
- 数据元素 = N * 数据项
Tips:数据广义上指所有能够输入到计算机中并被计算机处理的符号的总称。
我们用一个在js中很常见的数组来模拟数据结构,帮助我们更快理解:
const personList = [
{
name: "小明",
age: 18
},
{
name: "小红",
age: 16
}
]
const classList = [
{
className: "语文",
teacher: "小红妈妈"
},
{
className: "数学",
teacher: "小明爸爸"
}
]
// name、age(数据项)
// {item}(数据元素) = name、age
// personList(数据对象)= N * {item}
// data(数据) = personList + classList
1.1 逻辑结构
上面我们讲了数据结构的组成之一有逻辑结构,那么什么是逻辑结构?简单的来说逻辑结构就是数据元素之间的逻辑关系,逻辑结构大概统一的可以分成两种:线性结构、非线性结构。
线性结构:是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
常用的线性结构有: 栈、队列、链表、数组、线性表,上面模拟的例子典型就是一个线性结构。
非线性结构:各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。
常见的非线性结构有 图、树、集合等。
1.2 存储结构
存储结构是数结构在计算机中的表现,即逻辑结构用计算机语言的实现。常见的存储结构有:
-
顺序存储(在计算机中用一组物理位置连续的存储单元来储存线性结构的数据元素集合,也就是说结点间的逻辑关系由存储单元的邻接关系体现,比如数组)
- 优点1:占用内存小(物理逻辑关系没有占用内存)
- 优点2:随机存取效率高且时间对等
- 缺点:插入和删除操作需要移动元素,效率较低
-
链式存储(在计算机中用一组任意的(物理位置可以是连续,也可以不是)存储单元来存储数据,还需要主动建立数据间的关联关系(指附加的指针),比如链表)
- 存储节点 = 数据元素 + 指针
- 优点:插入和删除效率高、灵活,因为不需要移动元素,只要改变指针就行
- 缺点1:占用内存大,存储单元中除了要存储数据元素还需要存储指针
- 缺点2:查找效率要低一些
-
索引存储(索引存储方法是指通过建立存储结点信息,以及建立附加的索引表来标识结点的地址的存储方法)
-
散列存储(顺序和逻辑上都不存在顺序关系,但是你可以通过一定的方式去访问它的哈希表)
1.3总结
上面说了数据的逻辑结构是指数据元素之间整体的逻辑关系,而数据结构在计算机中的存储方式就是指存储结构。为了加深理解,我们举个例子,在工厂中,工人(数据元素)之间可能存在着同学关系、血缘关系、上下级关系、夫妻关系等,所有的这些关系都可以抽象的理解为数据元素之间的逻辑关系,即数据内部的构成方式,我们接着来看,那么他们在分配宿舍上分为男女宿舍,工作流水线上又以小组划分他们的工作区域,工人根据特定的逻辑关系(性别、小组划分等)在特定的区域工作或生活,就可以理解为数据元素根据他们之间的逻辑关系处于不同的区域,这个就被称为存储结构。
二、常见数据结构
- 栈(Stack)
- 队列(Queue)
- 数组(Array)
- 链表(Linked List)
- 树(Tree)
- 图(Graph)
- 堆(Heap)
- 散列表(Hash table)