数据结构
在计算机科学中,数据结构是一种数据组织,管理和存储格式,通常被选择以有效访问数据。更确切地说,数据结构是数据值的集合,它们之间的关系以及可以应用于数据的功能或操作,即,它是关于数据的代数结构。
用法
数据结构是抽像数据类型(ADT)的基础。 ADT定义了数据类型的逻辑形式。数据结构实现了数据类型的物理形式。
不同类型的数据结构适用于不同类型的应用程序,有些则适用于特定任务。例如,关系数据库通常使用B树索引进行数据检索,而编译器实现通常使用Hash表来查找标识符。
数据结构提供了一种有效地管理大量数据的方法,例如大型数据库和Internet索引服务。通常,有效的数据结构是设计有效算法的关键。一些正式的设计方法和编程语言强调数据结构而不是算法是软件设计中的关键组织因素。数据结构可用于组织存储在主内存和辅助内存中的信息的存储和检索。
执行
数据结构可以使用各种编程语言和技术实现,但是它们都共享有效组织和存储数据的共同目标。数据结构通常是基于计算机在其内存中的任何位置获取和存储数据的能力,该位置由指针指定的位置 - 代表内存地址的位字符串,该字符串本身可以存储在内存中并由程序操纵。因此,数组和记录数据结构基于计算具有算术操作的数据项的地址,而链接的数据结构基于结构本身中数据项的存储地址。这种数据结构方法对算法的效率和可扩展性具有深远的影响。例如,数组中的连续内存分配有助于快速访问和修改操作,从而在连续数据处理方案中获得了优化的性能。
数据结构的实现通常需要编写一组过程,以创建和操纵该结构的实例。数据结构的效率不能与这些操作分开分析。该观察结果激发了抽像数据类型的理论概念,该数据结构是通过在其上执行的操作间接定义的数据结构,以及这些操作的数学属性(包括其空间和时间成本)。
例子
有多种类型的数据结构,通常建立在简单的原始数据类型上。众所周知的例子是:
- 数组是特定顺序的许多元素,通常是所有相同类型的类型(取决于语言,单个元素可能都被迫是相同的类型,或者几乎是任何类型的类型)。使用整数索引访问元素以指定需要哪个元素。典型的实现为数组元素分配连续的内存词(但这并不总是必要的)。阵列可以是固定长度或可分解的。
- 链接列表(也刚刚称为列表)是任何类型的数据元素的线性集合,称为节点,每个节点本身都有一个值,并指向链接列表中的下一个节点。链接列表比数组的主要优点是,可以始终有效地插入和删除值的情况,而无需重新安置列表的其余部分。但是,某些其他操作(例如随机访问某个元素)在列表上的速度要慢于数组。
- 记录(也称为元组或结构)是汇总数据结构。记录是一个包含其他值的值,通常以固定数字和序列,通常由名称索引。记录的元素通常称为字段或成员。在面向对象的编程的上下文中,记录被称为普通的旧数据结构,可将它们与对象区分开。
- 哈希表,也称为哈希地图,是基于密钥的值快速检索值的数据结构。他们使用哈希功能将键映射到数组中的索引,从而在平均情况下可以恒定的时间访问。哈希表通常用于字典,库和数据库索引。但是,可能会发生哈希碰撞,这可能会影响其性能。采用链接和开放式寻址等技术来处理碰撞。
- 图是通过边缘连接的节点的集合,代表实体之间的关系。图表可用于建模社交网络,计算机网络和运输网络等。它们由顶点(节点)和边缘(节点之间的连接)组成。图形可以是指向或无方向性的,它们可以具有循环或无环。图形遍历算法包括广度优先搜索和深度优先搜索。
- 堆栈和队列是可以使用数组或链接列表实现的抽像数据类型。堆栈有两个主要操作:按下(在堆栈顶部添加一个元素)和pop(从堆栈中删除最高元素),这是最后一个In the of the of the of the of the of thot in of tirst of of of stack in of the of stack the of stack the of stack the of stack the of stack the of stack the of stack of stack。队列有两个主要操作:顾问(在队列的后部添加一个元素)和Dequeue(从队列的前部删除一个元素),该元素遵循首先出现的(FIFO)原理。
- 树代表元素的分层组织。一棵树由边缘连接的节点组成,一个节点是根,所有其他节点形成子树。树在各种算法和数据存储方案中广泛使用。二进制树(尤其是堆), AVL树和B树是一些流行的树木。它们实现了数据的有效且最佳的搜索,分类和分层表示。
- Trie ,也称为前缀树,是一种专门的树数据结构,用于有效检索字符串。尝试将字符串的字符存储为节点,每个边缘代表字符。它们在文本处理方案中特别有用,例如自动完成,拼写检查和字典实现。尝试在字符串上启用快速搜索和基于前缀的操作。
语言支持
大多数汇编语言和一些低级语言,例如BCPL (基本组合编程语言),缺乏对数据结构的内置支持。另一方面,许多高级编程语言和一些高级汇编语言(例如MASM )具有特殊的语法或对某些数据结构(例如记录和数组)的其他内置支持。例如,除向量(一维阵列)和多维数组外, C (BCPL的直接后代)和Pascal语言分别支持结构和记录。
大多数编程语言都具有某种库机制,可以通过不同的程序重复使用数据结构的实现。现代语言通常带有实施最常见数据结构的标准库。示例是C ++标准模板库, Java Collections Framework和Microsoft .NET框架。
现代语言通常还支持模块化编程,图书馆模块的接口及其实现之间的分离。有些提供不透明的数据类型,使客户可以隐藏实施详细信息。面向对象的编程语言,例如C ++ , Java和SmallTalk ,通常用于此目的。
许多已知的数据结构具有并发版本,允许多个计算线程同时访问数据结构的单个具体实例。