数据结构
数据结构是计算机科学中,组织和存储数据的方式,使得可以高效地访问和修改数据。 数据结构的选择对于算法的性能有着直接的影响,因为不同的数据结构提供了不同的访问和操作数据的方法。
一般说的数据结构可以分为两大类:线性数据结构和非线性数据结构。
-
线性数据结构:数据元素组成的序列,每个元素都有唯一的前驱和后继(除了第一个和最后一个元素)。常见的线性数据结构包括:
- 数组:一种固定大小的数据结构,可以看作是相同类型元素的集合,每个元素通过索引直接访问。
- 链表:由节点组成,每个节点包含数据和指向下一个节点的指针。链表可以动态增长和缩减。
- 栈:遵循后进先出(LIFO)原则的集合,只允许在一端(栈顶)进行添加和删除操作。
- 队列:遵循先进先出(FIFO)原则的集合,允许在一端(队尾)添加元素,在另一端(队首)删除元素。
-
非线性数据结构:数据元素不是按线性顺序排列,而是以更复杂的方式组织。常见的非线性数据结构包括:
- 树:由节点组成的层次结构,每个节点有零个或多个子节点,但只有一个父节点(除了根节点)。树的特例包括二叉树、平衡树(如AVL树)等。
- 图:由顶点(节点)集合和边集合组成,边可以是有向的也可以是无向的,表示顶点之间的关系。图可以用于模拟网络、路径寻找等问题。
- 堆:一种特殊的完全二叉树,满足特定的堆性质(如最大堆性质或最小堆性质),常用于实现优先队列。
除了这些基本的数据结构,还有更复杂的结构,如散列表(哈希表),它通过哈希函数将键映射到数组的索引,以实现快速的查找、插入和删除操作。
数据结构的选择取决于特定应用的需求
- 如果需要频繁地随机访问元素,数组可能是一个好的选择;
- 如果需要频繁地在序列的两端添加或删除元素,队列或栈可能更合适。
- 对于需要快速查找和排序的场景,树结构或散列表可能更加高效。
**问题1:**数据结构是与编程语言对应的还是,独立的?
- 数据结构定义了如何组织和存储数据,以及如何对数据进行操作,这些概念是通用的,不依赖于任何特定的编程语言。
- 不同的编程语言提供了不同的工具和特性来实现和操作数据结构。例如,数组、链表、栈、队列、树等数据结构可以在几乎所有的编程语言中找到,但是每种语言可能提供不同的方法来创建、访问、修改和遍历这些数据结构中的元素。
- 例如,C语言提供了指针,可以用来创建动态数组和链表;而Python语言提供了内置的列表(list)类型,它是一个动态数组,可以用来实现栈和队列;Java提供了泛型集合框架,可以方便地创建和使用各种数据结构,如ArrayList(动态数组)、LinkedList(双向链表)、HashMap(散列表)等。
当算法程序运行时,正在处理的数据主要存储在内存中,系统通过内存地址来访问目标位置的数据。
物理结构反映了数据在计算机内存中的存储方式,可分为连续空间存储(数组)和分散空间存储(链表)。物理结构从底层决定了数据的访问、更新、增删等操作方法,两种物理结构在时间效率和空间效率方面呈现出互补的特点。
所有数据结构都是基于数组、链表或二者的组合实现的。
- 基于数组可实现的数据结构,也称“静态数据结构”:栈、队列、哈希表、树、堆、图、矩阵、张量(维度>3的数组)等,初始化后长度不可变。
- 基于链表可实现的数据结构,也称“动态数据结构”:栈、队列、哈希表、树、堆、图等,在程序运行过程中对其长度进行调整。
原码、反码、补码:
note:
- 数字是以“补码”的形式存储在计算机中的;
- 负数的原码不能直接用于运算;
- 数字零的原码有 +0 和 −0 两种表示方式,负零的补码为 00000000 ,与正零的补码相同;
- 计算机内部的硬件电路主要是基于加法运算设计的