跳转到内容
新建笔记

数据结构

数据结构是计算机科学中,组织和存储数据的方式,使得可以高效地访问和修改数据。 数据结构的选择对于算法的性能有着直接的影响,因为不同的数据结构提供了不同的访问和操作数据的方法。

一般说的数据结构可以分为两大类:线性数据结构和非线性数据结构。

  1. 线性数据结构:数据元素组成的序列,每个元素都有唯一的前驱和后继(除了第一个和最后一个元素)。常见的线性数据结构包括:

    • 数组:一种固定大小的数据结构,可以看作是相同类型元素的集合,每个元素通过索引直接访问。
    • 链表:由节点组成,每个节点包含数据和指向下一个节点的指针。链表可以动态增长和缩减。
    • 栈:遵循后进先出(LIFO)原则的集合,只允许在一端(栈顶)进行添加和删除操作。
    • 队列:遵循先进先出(FIFO)原则的集合,允许在一端(队尾)添加元素,在另一端(队首)删除元素。
  2. 非线性数据结构:数据元素不是按线性顺序排列,而是以更复杂的方式组织。常见的非线性数据结构包括:

    • 树:由节点组成的层次结构,每个节点有零个或多个子节点,但只有一个父节点(除了根节点)。树的特例包括二叉树、平衡树(如AVL树)等。
    • 图:由顶点(节点)集合和边集合组成,边可以是有向的也可以是无向的,表示顶点之间的关系。图可以用于模拟网络、路径寻找等问题。
    • 堆:一种特殊的完全二叉树,满足特定的堆性质(如最大堆性质或最小堆性质),常用于实现优先队列。
img

除了这些基本的数据结构,还有更复杂的结构,如散列表(哈希表),它通过哈希函数将键映射到数组的索引,以实现快速的查找、插入和删除操作。

数据结构的选择取决于特定应用的需求

  • 如果需要频繁地随机访问元素,数组可能是一个好的选择;
  • 如果需要频繁地在序列的两端添加或删除元素,队列或栈可能更合适。
  • 对于需要快速查找和排序的场景,树结构或散列表可能更加高效。

**问题1:**数据结构是与编程语言对应的还是,独立的?

  • 数据结构定义了如何组织和存储数据,以及如何对数据进行操作,这些概念是通用的,不依赖于任何特定的编程语言。
  • 不同的编程语言提供了不同的工具和特性来实现和操作数据结构。例如,数组、链表、栈、队列、树等数据结构可以在几乎所有的编程语言中找到,但是每种语言可能提供不同的方法来创建、访问、修改和遍历这些数据结构中的元素。
  • 例如,C语言提供了指针,可以用来创建动态数组和链表;而Python语言提供了内置的列表(list)类型,它是一个动态数组,可以用来实现栈和队列;Java提供了泛型集合框架,可以方便地创建和使用各种数据结构,如ArrayList(动态数组)、LinkedList(双向链表)、HashMap(散列表)等。

当算法程序运行时,正在处理的数据主要存储在内存中,系统通过内存地址来访问目标位置的数据。

image-20240329200425128

物理结构反映了数据在计算机内存中的存储方式,可分为连续空间存储(数组)和分散空间存储(链表)。物理结构从底层决定了数据的访问、更新、增删等操作方法,两种物理结构在时间效率和空间效率方面呈现出互补的特点。

image-20240329200602929

所有数据结构都是基于数组、链表或二者的组合实现的。

  • 基于数组可实现的数据结构,也称“静态数据结构”:栈、队列、哈希表、树、堆、图、矩阵、张量(维度>3的数组)等,初始化后长度不可变。
  • 基于链表可实现的数据结构,也称“动态数据结构”:栈、队列、哈希表、树、堆、图等,在程序运行过程中对其长度进行调整。

原码、反码、补码:

image-20240329201940239

note:

  • 数字是以“补码”的形式存储在计算机中的;
  • 负数的原码不能直接用于运算;
  • 数字零的原码有 +0 和 −0 两种表示方式,负零的补码为 00000000 ,与正零的补码相同;
  • 计算机内部的硬件电路主要是基于加法运算设计的