【AI 测试】一:算法和数据结构理解

目录

    • 算法和数据结构理解
    • 概念及实际列子
      • 一、排序算法
        • 概念
        • 冒泡排序 (Bubble Sort)
        • 选择排序 (Selection Sort)
        • 插入排序 (Insertion Sort)
        • 归并排序 (Merge Sort)
        • 快速排序 (Quick Sort)
        • 堆排序 (Heap Sort)
        • 计数排序 (Counting Sort)
        • 桶排序 (Bucket Sort)
        • 基数排序 (Radix Sort)
      • 二、查找算法概念及代码示例
        • 1. 顺序查找(Linear Search)
        • 2. 二分查找(Binary Search)
        • 3. 哈希查找(Hash Search)
        • 4. 树形查找(如AVL树、红黑树)
          • AVL树代码示例
      • 三、图算法
        • 图算法概念
        • 深度优先搜索(DFS)
        • 广度优先搜索(BFS)
        • 最短路径算法
        • 最小生成树算法

“算法和数据结构理解”以及这些技能需要掌握的知识点。

算法和数据结构理解

# 算法和数据结构理解## 算法理解
- 排序算法- 冒泡排序- 选择排序- 插入排序- 归并排序- 快速排序- 堆排序- 计数排序- 桶排序- 基数排序
- 查找算法- 顺序查找- 二分查找- 哈希查找- 树形查找(如AVL树、红黑树)
- 图算法- 深度优先搜索- 广度优先搜索- 最短路径算法(如Dijkstra、Floyd-Warshall)- 最小生成树算法(如Prim、Kruskal)## 数据结构理解
- 线性数据结构- 数组- 链表(单向链表、双向链表、循环链表)- 栈- 队列
- 树形数据结构- 二叉树- AVL树- 红黑树- B树- B+树- 堆(二叉堆、斐波那契堆)
- 图形数据结构- 邻接矩阵- 邻接表## 性能测试与评估
- 时间复杂度分析
- 空间复杂度分析
- 稳定性测试
- 边界条件测试## 设计测试场景与用例
- 根据算法特性设计测试场景
- 构造有效与无效的测试用例
- 验证算法的正确性与效率

概念及实际列子

一、排序算法

概念

冒泡排序(Bubble Sort)

冒泡排序是一种简单的交换排序算法。它重复地遍历要排序的元素,比较每对相邻的元素,如果它们的顺序错误就交换它们。
时间复杂度:最好情况下为O(n),最坏情况下为O(n^2)。

选择排序(Selection Sort)

选择排序是一种简单直观的排序算法。它的工作原理是每次从未排序的元素中选择最小(或最大)的元素,放到已排序的序列末尾。
时间复杂度:始终为O(n^2),无论输入数据的排列情况如何。

插入排序(Insertion Sort)

插入排序是一种简单直观的排序算法。它的工作原理是构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
时间复杂度:最好情况下为O(n),最坏情况下为O(n^2)。

快速排序(Quick Sort)

快速排序是一种分治算法。它通过选择一个基准元素,将原始序列分割成两个子序列,然后对子序列进行递归排序来实现排序。
时间复杂度:最好情况下为O(nlogn),最坏情况下为O(n^2),平均情况下为O(nlogn)。

归并排序(Merge Sort)

归并排序是一种分治算法。它将原始序列递归地分成较小的序列,直到每个子序列只有一个元素,然后将相邻的子序列两两合并,最终得到排序后的序列。
时间复杂度:始终为O(nlogn)。

堆排序(Heap Sort)

堆排序是一种选择排序算法。它利用了堆这种数据结构的性质,通过建立最大堆(或最小堆)来实现排序。
时间复杂度:始终为O(nlogn)。

以下分别是各种排序算法的Python代码示例:

冒泡排序 (Bubble Sort)
def bubble_sort(arr):  n = len(arr)  # 遍历所有数组元素  for i in range(n):  # Last i elements are already in place  for j in range(0, n - i - 1):  # 遍历数组从0到n-i-1  # 交换如果元素找到是大于下一个元素  if arr[j] > arr[j + 1] :  arr[j], arr[j + 1] = arr[j + 1], arr[j]  # 测试数组  
arr = [64, 34, 25, 12, 22, 11, 90]  bubble_sort(arr)  print ("排序后的数组:")  
for i in range(len(arr)):  print ("%d" %arr[i]),

在上面的代码中,我们定义了一个 bubble_sort 函数,它接受一个列表 arr 作为参数,并对其进行排序。

外层循环 for i in range(n) 遍历整个数组,由于每一轮冒泡排序后,最大的元素都会移到正确的位置(数组的末尾),所以下一轮就不需要再比较已经排好的元素。

内层循环 for j in range(0, n - i - 1) 用来在每一轮中比较相邻的元素,并交换位置(如果前一个元素比后一个元素大)。这样,每一轮结束后,都会有一个元素被放到正确的位置。

最终,数组 arr 就会被排序好,并通过 for 循环输出排序后的结果。

选择排序 (Selection Sort)
def selection_sort(arr):  # 遍历所有数组元素  for i in range(len(arr)):  # 找到当前未排序部分中的最小元素  min_idx = i  for j in range(i+1, len(arr)):  if arr[j] < arr[min_idx]:  min_idx = j  # 将找到的最小元素交换到已排序序列的末尾  arr[i], arr[min_idx] = arr[min_idx], arr[i]  # 测试数组  
arr = [64, 34, 25, 12, 22, 11, 90]  # 调用选择排序函数  
selection_sort(arr)  # 输出排序后的数组  
print("排序后的数组:")  
for i in range(len(arr)):  print("%d" % arr[i]),

在这个代码中,我们首先获取数组的长度,然后开始遍历数组。对于每个位置 i,我们假设该位置上的元素是最小的,然后遍历从 i+1 到数组末尾的所有元素,如果发现一个更小的元素,我们就更新最小元素的索引。最后,我们将位置 i 上的元素与找到的最小元素进行交换。

通过这种方式,每次循环后,位置 i 上的元素都会是未排序部分中的最小元素,并且已经位于正确的位置上。最终,整个数组都会被排序。

选择排序的时间复杂度为 O(n^2),其中 n 是数组的长度。与冒泡排序相似,选择排序也不是最高效的排序算法,但对于小数据集或特定应用场景,它仍然是一个简单且可行的选择。

如果以上代码要选出最大的一个元素,我们只需要在内部循环中比较时改变比较的方向。即,我们需要将比较 arr[j] < arr[min_idx] 改为 arr[j] > arr[max_idx],并相应地更新变量名从 min_idx 到 max_idx

插入排序 (Insertion Sort)
def insertion_sort(arr):  # 遍历从1到数组长度的所有元素  for i in range(1, len(arr)):  # 当前需要排序的元素  key = arr[i]  # 与已排序的元素从后往前逐个比较  j = i - 1  while j >= 0 and key < arr[j]:  # 如果当前元素(已排序)大于key,将该元素移到下一位置  arr[j + 1] = arr[j]  j -= 1  # 找到key的正确位置并插入  arr[j + 1] = key  # 测试数组  
arr = [12, 11, 13, 5, 6]  # 调用插入排序函数  
insertion_sort(arr)  # 输出排序后的数组  
print("排序后的数组:")  
for i in range(len(arr)):  print("%d" % arr[i]),

在这个代码中,我们首先从数组的第二个元素开始遍历(索引为1,因为索引0的元素默认已经是排序好的)。对于每个元素,我们将其存储在变量key中,并与它前面的已排序元素进行比较。如果前面的元素比key大,我们就将该元素向后移动一位。这个过程一直持续到找到key的正确位置,然后将key插入到该位置。

插入排序的时间复杂度在最坏情况下是O(n^2),其中n是数组的长度。尽管它的时间复杂度与冒泡排序和选择排序相同,但由于插入排序在实际应用中移动数据的操作较少,因此在某些情况下它比冒泡排序和选择排序更快。然而,对于大规模数据集,插入排序通常不是最高效的选择。

归并排序 (Merge Sort)

归并排序(Merge Sort)是一种分治策略的排序算法。它将一个大数组分割成两个小数组,分别对这两个小数组进行排序,然后将已排序的小数组合并成一个大的有序数组。以下是归并排序的Python代码示例:

def merge_sort(arr):# 递归终止条件:如果数组长度为0或1,则直接返回if len(arr) <= 1:return arr# 分割数组mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]# 递归排序左半部分和右半部分left_half = merge_sort(left_half)right_half 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——环形链表的约瑟夫问题

题目链接&#xff1a; 环形链表的约瑟夫问题_牛客题霸_牛客网 题目&#xff1a; 描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留…

17. 网络编程2

本合集已发布文章 (一)Linux应用编程基本概念 (二)Linux文件I/O基础 (三)Linux标准I/O库

idm线程越多越好吗 idm线程数多少合适 IDM百度云下载 IDM下载器如何修改线程数

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的网络下载器&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM线…

【形而上学】数据治理之元数据——用数据的数据管理数据

【形而上学】数据治理之元数据——用数据的数据管理数据 一、都柏林核心元数据元素集二、元数据2.1 什么是元数据2.2 元数据类型2.3 实现元数据的技术 三、元数据相关标准 一、都柏林核心元数据元素集 1995年3月&#xff0c;NCSA与OCLC共同在俄亥俄州都柏林市举行了一次仅有受邀…

Linux命令学习—linux 的常用命令

1.1、改变目录 cd 目录的表达方法&#xff1a; /根目录 .当前目录 .. 上一级目录 ~家目录 #cd / 进入到系统根目录 #cd . 进入当前目录 #cd .. 进入当前目录的父目录&#xff0c;返回上层目录 #cd /tmp 进入指定目录/tmp #cd ~ 进入当前用户的家目录 #cd …

【智能优化算法详解】粒子群算法PSO量子粒子群算法QPSO

1.粒子群算法PSO 博主言简意赅总结-算法思想&#xff1a;大方向下个体自学习探索群体交流共享 对比适应度找到最优点 背景 粒子群算法&#xff0c;也称粒子群优化算法或鸟群觅食算法&#xff08;Particle Swarm Optimization&#xff09;&#xff0c; 缩写为 PSO。粒子群…

Linux:文本编辑器 - vim

Linux&#xff1a;文本编辑器 - vim vim基本操作普通模式模式切换移动光标复制粘贴删除替换撤销 底行模式行号查找 vim基本操作 Vim(Vi Improved)是一款功能强大的文本编辑器&#xff0c;是Unix/Linux系统中广泛使用的编辑器之一。它源于上世纪70年代开发的Vi编辑器&#xff0…

C#学习笔记9:winform上位机与西门子PLC网口通信_上篇

今日继续我的C#学习笔记&#xff0c;今日开始学习打开使用千兆网口来进行与西门子PLC的通信&#xff1a; 文章提供整体代码、解释、测试效果截图、整体测试工程下载&#xff1a; 主要包含的知识有&#xff1a;下载NuGet程序包、西门子PLC及通信协议、搭建虚拟的S7通信仿真环境…

为了进阿里拿Offer,逼得我两个月吃透了这些Java高级面试题解析,终于上岸

JVM与调优 21 题及答案解析 JVM的内存结构。 JVM方法栈的工作过程&#xff0c;方法栈和本地方法栈有什么区别。 JVM的栈中引用如何和堆中的对象产生关联。 可以了解一下逃逸分析技术。 gc的常见算法 CMS以及G1的垃圾回收过程&#xff0c;CMS的各个阶段哪两个是Stop the wo…

前端解决跨域问题

什么是跨域&#xff1f; 跨域是浏览器行为&#xff0c;是浏览器的一种安全策略&#xff1b;由于浏览器 同源策略 导致浏览器访问服务器时被拦截 同源策略&#xff08;Sameoriginpolicy&#xff09;&#xff1a; 是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&am…

51.网络游戏逆向分析与漏洞攻防-角色管理功能通信分析-角色选择的模拟与截取

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&…

制造业、能源等传统行业进行数字化转型时要注意哪些问题?

制造业、能源等传统行业在进行数字化转型时需要注意以下几个关键问题&#xff1a; 1、明确转型目标和战略规划&#xff1a;企业需要根据自身的业务特点、市场需求和长远发展目标&#xff0c;制定清晰的数字化转型战略。包括确定转型的重点领域、预期成果、时间表和资源投入。 …

阿里云云效CI/CD配置

1.NODEJS项目流水线配置(vue举例) nodejs构建配置 官方教程 注意:下图的dist是vue项目打包目录名称,根据实际名称配置 # input your command here cnpm cache clean --force cnpm install cnpm run build 主机部署配置 rm -rf /home/vipcardmall/frontend/ mkdir -p /home/…

计算分数和-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第48讲。 计算分数和&#…

java并发体系-锁

ReentrantLock ReentrantLock是Java并发编程中的一种锁机制。它的基本流程如下&#xff1a; 创建ReentrantLock对象。在需要加锁的代码块前调用lock()方法&#xff0c;该方法会尝试获取锁&#xff0c;如果锁已被其他线程占用&#xff0c;则当前线程会被阻塞。执行需要加锁的代…

redis架构知识点

Redis 在规模如下&#xff1a; 机器内存总量约70TB&#xff0c;实际使用内存约40TB&#xff1b;平均每秒处理约1500万次请求&#xff0c;峰值每秒约2000万次请求&#xff1b;每天处理约1万亿余次请求&#xff1b;单集群每秒处理最高每秒约400万次请求&#xff1b;集群实例与单机…

3 突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

[dvwa] sql injection(Blind)

blind 0x01 low 1’ and length(version()) 6 # syntax: substr(string , from<start from 1>, cut length) 1’ and substr(version(),1,1) ‘5’ # 1’ and substr(version(),2,1) ‘.’ # 1’ and substr(version(),3,1) ‘7’ # 1’ and substr(version(),4,…

leetcode 322

leetcode 322 题目 例子 思路 记忆化搜索&#xff0c;使用数组&#xff0c;记录val的最少硬币数量&#xff1b; 递归加bfs; 代码实现 #include <vector> #include <climits> // For INT_MAX #include <algorithm> // For minclass Solution { public:int…

C#下Httpclient post请求获取令牌

1.postman测试ok 2.C#代码 public static async Task<string> testGetToken(string URL, string param){string responseBody "eee";//using (var clientHandler new HttpClientHandler()){ var handler new HttpClientHandler();handler.ServerCertificat…