备战计算机二级公共基础知识(二)----基本数据结构与算法

目录

基本数据结构与算法

算法的基本概念;算法复杂度的概念和意义(时间复杂度与空间复杂度)

数据结构的定义;数据的逻辑结构与存储结构;数据结构的图形表示;线性结构与非线性结构的概念

线性表的定义;线性表的顺序存储结构及其插入与删除运算

栈和队列的定义;栈和队列的顺序存储结构及其基本运算

线性单链表、双向链表与循环链表的结构及其基本运算

树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历

顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)


基本数据结构与算法

算法的基本概念;算法复杂度的概念和意义(时间复杂度与空间复杂度)

算法的基本概念: 算法是指解决问题或完成任务的一系列明确步骤的有限集合。它是一个精确而又完整的描述,用于解决特定问题,并产生期望的输出结果。

算法复杂度的概念和意义: 算法复杂度是衡量算法性能和效率的指标。它可以帮助我们评估算法在输入规模增大时的运行时间和空间占用情况。两个主要的复杂度指标是时间复杂度和空间复杂度。

时间复杂度(Time Complexity):是衡量算法执行时间随着问题规模增长而增加的速度。它表示了算法执行所需要的操作次数。我们通常使用大O记号来表示时间复杂度。时间复杂度越低,算法执行越快。

空间复杂度(Space Complexity):是衡量算法所需的额外空间随着问题规模增长而增加的速度。它表示了算法所使用的存储空间大小。也使用大O记号来表示空间复杂度。空间复杂度越低,算法所需的额外空间越少。

算法复杂度的意义在于:

  1. 评估算法的效率:通过分析和比较不同算法的复杂度,我们可以选择性能最佳的算法来解决问题。
  2. 预测算法的运行时间和空间消耗:通过复杂度分析,我们可以对算法在不同输入规模下的资源占用情况进行估计,以便更好地调整和优化算法。
  3. 优化程序设计:了解算法复杂度有助于我们在设计程序时更加注重效率,并避免使用低效的算法。

数据结构的定义;数据的逻辑结构与存储结构;数据结构的图形表示;线性结构与非线性结构的概念

数据结构的定义: 数据结构是指组织和存储数据的方式,它涉及到数据的表示、操作和关系等方面。数据结构旨在有效地组织和管理数据,使得数据可以被高效地访问、操作和处理。

数据的逻辑结构与存储结构:

  • 数据的逻辑结构(Logical Structure)描述数据元素之间的关系和限制,包括线性结构、非线性结构和集合结构等。逻辑结构与具体实现无关,主要关注数据元素之间的逻辑关系。
  • 数据的存储结构(Storage Structure)指的是将数据和关系存储在计算机内存中的方式。存储结构与具体实现有关,主要关注数据在计算机内存中的物理存储形式。

数据结构的图形表示: 数据结构可以使用各种图形来表示,常见的包括:

  • 线性表(如数组、链表)通常用连续或离散的线段表示。
  • 树(如二叉树、AVL树)通常用节点和连接线表示,节点表示数据元素,连接线表示节点之间的关系。
  • 图(如有向图、无向图)通常用节点和边表示,节点表示数据元素,边表示节点之间的关系。

线性结构与非线性结构的概念:

  • 线性结构(Linear Structure)是数据元素之间存在一对一的关系,数据元素之间仅有一个直接前驱和一个直接后继。常见的线性结构包括线性表、栈和队列等。
  • 非线性结构(Nonlinear Structure)是数据元素之间存在一对多或多对多的关系,数据元素之间没有严格的前驱和后继关系。常见的非线性结构包括树和图等。

线性结构中的数据元素之间存在顺序关系,可以按照一定规则进行插入、删除和访问等操作。而非线性结构中的数据元素之间没有固定的次序关系,其组织形式更加灵活。线性结构和非线性结构在数据的表示和处理方式上有一定区别,适用于不同的问题场景和算法设计。

线性表的定义;线性表的顺序存储结构及其插入与删除运算

线性表的定义: 线性表是由n个数据元素构成的有限序列,数据元素之间存在一对一的前驱和后继关系。线性表可以为空表,也可以包含一个或多个数据元素。

线性表的顺序存储结构: 线性表的顺序存储结构是将线性表的数据元素顺序地存储在计算机内存的连续存储空间中。通常使用数组来实现线性表的顺序存储结构。在顺序存储结构中,线性表中的元素在内存中是连续存储的,可以通过下标直接访问和操作元素。

插入操作: 在顺序存储结构的线性表中,插入元素可以分为三种情况:

  1. 在表的开头插入元素:需要将原先的所有元素向后移动一位,然后将新元素放入第一个位置。
  2. 在表的中间插入元素:需要将插入位置后的元素都向后移动一位,然后将新元素放入插入位置。
  3. 在表的末尾插入元素:直接将新元素放在顺序表的最后位置。

删除操作: 在顺序存储结构的线性表中,删除元素同样也有三种情况:

  1. 删除表的开头元素:需要将后面的所有元素都向前移动一位,然后将最后一个元素删除。
  2. 删除表的中间元素:需要将删除位置后的元素都向前移动一位,然后将最后一个元素删除。
  3. 删除表的末尾元素:直接将顺序表的最后一个元素删除。

栈和队列的定义;栈和队列的顺序存储结构及其基本运算

栈和队列的定义: 栈和队列是两种常用的数据结构,它们都可以通过数组或链表来实现。栈和队列都是一种操作受限的线性表。

栈(Stack)是一种特殊的线性表,它只允许在一端进行插入和删除操作,这一端被称为栈顶(Top),另一端被称为栈底(Bottom)。栈中元素的先进后出原则称为栈的“后进先出”(Last In First Out,LIFO)特性。

队列(Queue)也是一种线性表,但它只允许在一端进行插入操作,在另一端进行删除操作。队列的插入操作在队头进行,删除操作在队尾进行。队列中元素的先进先出原则称为队列的“先进先出”(First In First Out,FIFO)特性。

栈和队列的顺序存储结构: 栈和队列的顺序存储结构都可以使用数组来实现。在栈的顺序存储结构中,栈顶元素一般存储在数组的最后一个位置,栈底元素存储在数组的第一个位置。在队列的顺序存储结构中,队头元素存储在数组的第一个位置,队尾元素存储在数组的最后一个位置。

栈的基本运算:

  1. 入栈(Push):将元素插入到栈顶,栈顶指针向上移动。
  2. 出栈(Pop):从栈顶删除一个元素,栈顶指针向下移动。
  3. 取栈顶元素(GetTop):返回当前栈顶的元素,但不删除栈顶元素。
  4. 判断栈是否为空(IsEmpty):当栈顶指针等于-1时,栈为空。

队列的基本运算:

  1. 入队(Enqueue):将元素插入到队尾,队尾指针向上移动。
  2. 出队(Dequeue):从队头删除一个元素,队头指针向下移动。
  3. 取队头元素(GetFront):返回当前队头的元素,但不删除队头元素。
  4. 判断队列是否为空(IsEmpty):当队头指针等于队尾指针时,队列为空。

在栈和队列的顺序存储结构中,插入和删除操作的效率较高。但当元素个数增加时,可能需要频繁地进行数组的移动和扩容操作,因此在实际应用中需要根据具体情况选择适合的数据结构和操作方式。

线性单链表、双向链表与循环链表的结构及其基本运算

线性单链表、双向链表和循环链表是常见的链式存储结构,它们都由节点(Node)组成,每个节点包含数据元素和指向下一个节点的指针(单链表和循环链表还可能包含指向前一个节点的指针)。

  1. 线性单链表(Singly Linked List):

    • 结构:每个节点包含数据元素和指向下一个节点的指针。最后一个节点的指针指向空。
    • 基本运算:
      • 插入操作(Insert):在指定位置插入新节点,需要修改相邻节点的指针。
      • 删除操作(Delete):删除指定位置的节点,需要修改相邻节点的指针。
      • 查找操作(Search):从头节点开始依次遍历链表,直到找到目标节点或遍历结束。
      • 遍历操作(Traverse):从头节点开始依次访问链表的每个节点。
  2. 双向链表(Doubly Linked List):

    • 结构:每个节点包含数据元素、指向前一个节点的指针和指向下一个节点的指针。第一个节点的前驱指针和最后一个节点的后继指针指向空。
    • 基本运算:
      • 插入操作(Insert):在指定位置插入新节点,需要修改前后节点的指针。
      • 删除操作(Delete):删除指定位置的节点,需要修改前后节点的指针。
      • 查找操作(Search):可以从头节点或尾节点开始遍历链表,直到找到目标节点或遍历结束。
      • 遍历操作(Traverse):可以从头节点或尾节点开始依次访问链表的每个节点。
  3. 循环链表(Circular Linked List):

    • 结构:每个节点包含数据元素和指向下一个节点的指针。最后一个节点的指针指向头节点,形成一个循环。
    • 基本运算:
      • 插入操作(Insert):在指定位置插入新节点,需要修改相邻节点的指针,并处理循环关系。
      • 删除操作(Delete):删除指定位置的节点,需要修改相邻节点的指针,并处理循环关系。
      • 查找操作(Search):从头节点开始依次遍历链表,直到找到目标节点或一圈遍历结束。
      • 遍历操作(Traverse):从头节点开始依次访问链表的每个节点,可以根据需要设置停止条件。

在链式存储结构中,插入和删除操作相对顺序存储结构更加灵活高效,但需要额外的指针来记录节点之间的关系。选择哪种链式存储结构取决于具体场景和需求,例如需要双向遍历时可选择双向链表,需要循环访问时可选择循环链表。

树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历

树是一种非线性的数据结构,它由若干个节点组成,节点之间存在一对多的层次关系。树的基本概念包括以下几个要点:

  1. 节点:树中的每个元素称为节点,每个节点可以包含一个数据元素以及指向其他节点的指针。
  2. 根节点:树中的顶层节点被称为根节点,它是整个树的唯一入口。
  3. 父节点与子节点:节点之间存在父子关系,树中的节点可以有零个或多个子节点,而每个子节点都只有一个父节点。
  4. 兄弟节点:有同一个父节点的节点被称为兄弟节点。
  5. 叶节点:没有子节点的节点被称为叶节点或终端节点。
  6. 子树:树中的任意一个节点及其所有后代节点所构成的集合称为子树。

二叉树是树的一种特殊形式,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的定义如下:

二叉树的定义: 二叉树可以为空,如果不为空,则由根节点和左子树、右子树组成,左子树和右子树也都是二叉树。

二叉树的存储结构: 二叉树的存储结构有两种常见形式:顺序存储和链式存储。

  • 顺序存储:使用数组来存储二叉树节点的数据,并利用数组下标表示节点之间的层次关系。
  • 链式存储:每个节点包含数据元素以及左子节点和右子节点的指针。

二叉树的遍历方式有三种常见方式:前序遍历、中序遍历和后序遍历。

  1. 前序遍历(Preorder Traversal):

    • 先访问根节点,然后按照前序遍历的顺序递归地遍历左子树和右子树。
    • 访问顺序:根节点 -> 左子树 -> 右子树。
  2. 中序遍历(Inorder Traversal):

    • 先按照中序遍历的顺序递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。
    • 访问顺序:左子树 -> 根节点 -> 右子树。
  3. 后序遍历(Postorder Traversal):

    • 先按照后序遍历的顺序递归地遍历左子树和右子树,然后访问根节点。
    • 访问顺序:左子树 -> 右子树 -> 根节点。

顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)

 

顺序查找和二分法查找是两种常见的查找算法。

顺序查找: 顺序查找也被称为线性查找,它的基本思想是从数据集合的第一个元素开始,按照顺序依次检查每个元素,直到找到目标元素为止或者遍历完整个数据集合。顺序查找的时间复杂度为 O(n),其中 n 表示数据集合中元素的个数。

二分法查找: 二分法查找也被称为折半查找,它的基本思想是将有序数据集合分成两部分,通过比较目标元素与中间元素的大小关系,缩小查找区间,直到找到目标元素为止或者确定目标元素不存在于数据集合中。二分法查找的时间复杂度为 O(log n),其中 n 表示数据集合中元素的个数。

基本排序算法包括以下三类:

  1. 交换类排序:

    • 冒泡排序(Bubble Sort):依次比较相邻两个元素,将较大(小)的元素交换到右侧(左侧),直到最后一个元素。
    • 快速排序(Quick Sort):选择一个基准元素,将比基准元素小(大)的元素放在其左侧(右侧),再分别对左右两部分进行快速排序。
    • 选择排序(Selection Sort):每次选择最小(大)的元素放在已排序部分的最后面。
  2. 选择类排序:

    • 直接插入排序(Insertion Sort):将未排序的数据插入已排序部分的合适位置,使得已排序部分仍然有序。
    • 希尔排序(Shell Sort):采用分组插入排序的方法,对分组后的数据进行插入排序。
  3. 插入类排序:

    • 简单选择排序(Simple Selection Sort):从未排序部分中选择最小(大)的元素,放到已排序部分的末尾。
    • 堆排序(Heap Sort):建立一个最大(小)堆,依次取堆顶元素并删除,即可得到有序序列。
    • 归并排序(Merge Sort):将原始序列递归地分成若干子序列,并将这些子序列两两合并成为有序序列。
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善程序员文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值