第一章-绪论

知识点

1. 数据结构的定义和作用:
   - 数据结构的定义:数据结构是指数据元素之间的关系,以及这些关系在计算机中的表示和操作方式。
   - 数据结构的作用:数据结构为我们组织和管理数据提供了一种有效的方式,能够提高数据的存储、检索和操作效率。

2. 算法的基本概念:
   - 算法的定义:算法是解决特定问题的一系列有序步骤的描述。
   - 算法的输入和输出:算法接受输入数据,并产生输出结果。
   - 算法的正确性:算法必须满足问题的要求,产生正确的输出。
   - 算法的效率:算法执行所需的时间和空间资源。

3. 算法分析:
   - 时间复杂度:衡量算法执行时间随输入规模增长的增长率。
   - 空间复杂度:衡量算法所需的额外空间随输入规模增长的增长率。
   - 渐进符号表示法:用于表示算法复杂度的大O符号和其他渐进符号。

4. 数据结构的分类:
   - 线性结构:数据元素之间存在一对一的关系,如数组、链表、栈和队列等。
   - 树形结构:数据元素之间存在一对多的层次关系,如二叉树、堆和AVL树等。
   - 图形结构:数据元素之间存在多对多的关系,如有向图和无向图等。

5. 抽象数据类型(ADT):
   - ADT的定义:ADT是一种数学模型,用于描述数据对象的逻辑特性和可执行的操作集合。
   - ADT的特点:封装数据和操作,隐藏内部实现细节,只暴露对外的接口。
   - ADT的应用:ADT可以用于问题建模和算法设计,提供了一种高层次的抽象。

6. 数据结构的表示和操作:
   - 数组:连续存储的数据结构,可以通过索引访问元素。
   - 链表:非连续存储的数据结构,通过指针链接元素。
   - 栈:具有后进先出(LIFO)特性的数据结构。
   - 队列:具有先进先出(FIFO)特性的数据结构。

时间复杂度和空间复杂度

时间复杂度和空间复杂度是用于衡量算法性能的指标。时间复杂度表示算法执行所需的时间资源,而空间复杂度表示算法执行所需的额外空间资源。以下是它们的计算方式和一些示例说明:

时间复杂度的计算方式:


1. 基本原则:在计算时间复杂度时,通常关注算法的主要操作数量随输入规模增长的趋势,并忽略常数因子和低阶项。

2. 大O符号表示法:时间复杂度使用大O符号表示,如O(1)、O(n)、O(n^2)等。它表示算法执行时间的上界,即算法最坏情况下的时间复杂度。

3. 计算方式:可以通过以下方式计算时间复杂度:
   - 逐行分析:根据算法的每个操作和循环来分析执行次数,并计算总的执行次数。
   - 嵌套循环:对于嵌套循环,将每个循环的执行次数相乘来计算总的执行次数。
   - 选择结构:对于选择结构(如if语句),计算执行次数的最坏情况。

示例说明:
1. 线性查找算法的时间复杂度:
   ```python
   def linear_search(arr, target):
       for i in range(len(arr)):
           if arr[i] == target:
               return i
       return -1
   ```
   - 时间复杂度:O(n),其中n是输入数组的大小。最坏情况下,需要遍历整个数组才能找到目标元素。

2. 插入排序算法的时间复杂度:
   ```python
   def insertion_sort(arr):
       for i in range(1, len(arr)):
           key = arr[i]
           j = i - 1
           while j >= 0 and arr[j] > key:
               arr[j + 1] = arr[j]
               j -= 1
           arr[j + 1] = key
   ```
   - 时间复杂度:O(n^2),其中n是输入数组的大小。最坏情况下,需要进行两层嵌套循环,每次循环都需要比较和移动元素。

空间复杂度的计算方式:


1. 基本原则:在计算空间复杂度时,通常关注算法执行所需的额外空间随输入规模增长的趋势,并忽略常数因子和低阶项。

2. 大O符号表示法:空间复杂度使用大O符号表示,如O(1)、O(n)、O(n^2)等。它表示算法所需额外空间的上界,即算法最坏情况下的空间复杂度。

3. 计算方式:可以通过以下方式计算空间复杂度:
   - 占用空间的变量:计算算法中使用的额外变量所占用的空间大小。
   - 递归调用:计算递归调用所需的系统栈空间大小。

示例说明:
1. 快速排序算法的空间复杂度:
   ```python
   def quicksort(arr):
       if len(arr) <= 1:
           return arr
       pivot = arr[0]
       less = [x for x in arr[1:] if x <= pivot]
       greater = [x for x in arr[1:] if x > pivot]
       return quicksort(less) + [pivot] + quicksort(greater)
   ```
   - 空间复杂度:O(n),其中n是输入数组的大小。在每次递归调用中,需要创建两个额外的辅助数组(less和greater)来存储元素。

2. 矩阵乘法算法的空间复杂度:
   ```python
   def matrix_multiply(A, B):
       n = len(A)
       C = [[0] * n for _ in range(n)]
       for i in range(n):
           for j in range(n):
               for k in range(n):
                   C[i][j] += A[i][k] * B[k][j]
       return C
   ```
   - 空间复杂度:O(n^2),其中n是输入矩阵的大小。算法需要创建一个额外的矩阵C来存储结果。

通过计算时间复杂度和空间复杂度,我们可以评估算法的效率和资源消耗,从而选择最合适的算法来解决问题。

算法的五大性质

算法的五大性质是指算法应该满足的基本要求和特性。这些性质有助于确保算法的正确性、可读性、可理解性和可维护性。以下是算法的五大性质:

1. 有限性(Finiteness):算法必须在有限的步骤内执行结束,不会陷入无限循环或无法终止的状态。算法的执行时间应该是可预测的,不会无限延长。

2. 确定性(Definiteness):算法的每一步骤必须明确定义,没有歧义。对于给定的输入,算法的执行结果应该是唯一确定的,不会出现二义性。

3. 输入(Input):算法应该有零个或多个输入,它们是算法执行的初始数据。输入可以是外部提供的,也可以是由先前的计算结果得到的。

4. 输出(Output):算法应该产生至少一个输出,它是算法执行结束后得到的结果。输出可以是返回给调用者的值,也可以是对数据结构的修改或其他形式的输出。

5. 可行性(Feasibility):算法的每个步骤必须是可行的,即可以通过有限的时间和资源来执行。算法的实现应该是可行的,不依赖于不可实现的操作或资源。

这些性质是算法应该具备的基本特性,它们确保了算法的正确性和可行性。当设计和实现算法时,需要考虑这些性质,以确保算法在各种情况下都能正确地执行,并且可以被理解、维护和改进。

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

需要什么私信我

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

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

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

打赏作者

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

抵扣说明:

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

余额充值