当前位置: 首页 > news >正文

数据结构编程实践20讲(Python版)—01数组

本文目录

      • 01 数组 array
        • S1 说明
        • S2 举例
        • S3 问题:二维网格中的最小路径
          • 求解思路
          • Python3程序
        • S4 问题:图像左右变换
          • 求解思路
          • Python3程序
        • S5 问题:青蛙过河
          • 求解思路
          • Python3程序

写在前面

数据结构是计算机科学中的一个重要概念,用于组织和存储数据,以便于高效的访问和修改。不同的数据结构适用于不同类型的应用场景,选择合适的数据结构对于算法的性能至关重要。

常见的数据结构可以分为线性和非线性两大类。

  • 线性数据结构包括数组、链表、栈和队列,适合存储顺序关系的数据。数组提供随机访问能力,而链表则在插入和删除操作上更具灵活性。栈和队列分别实现后进先出(LIFO)和先进先出(FIFO)的访问模式。
  • 非线性数据结构包括树和图。树结构(如二叉树、AVL树和B树)用于表示层次关系,广泛应用于搜索和排序。图则用于表示复杂的连接关系,适合网络、社交图等场景。

此外,散列结构(如哈希表和哈希集合)提供了快速的查找和插入操作,字典和集合则用于存储键值对和不重复元素。高级数据结构如Trie和并查集则解决特定问题,如字符串匹配和动态连通性。

该系列中所给的问题并不是最复杂的,同时给的解法的时间复杂度不一定是最优的,因为本系列主要讲解数据结构。

01 数组 array

S1 说明

数组是一种数据结构,用于存储固定大小的元素集合。每个元素在数组中的位置由一个索引(或下标)唯一标识。通常从零开始。数组中的所有元素类型相同,提供随机访问和直接存取的能力。


S2 举例

在Python中,数组可以通过列表、array模块或NumPy库实现。选择哪种实现方式取决于具体的需求,例如数据类型的统一性、性能需求以及可用的库。对于一般的应用,列表通常足够用;而对于科学计算,NumPy数组则提供了更高效的操作。

  • 列表
a = [1, 2, 3, 8, 11]# 多维
b = [[1, 2, 1, -1, -2]]
c = [[1, 2, 1, -1, -2], [1, 2]]
  • 自带的array模块
import array
my_array = array.array('i', [1, 4, 9, 64, 121])  # 'i'表示整型# 多维
rows = 3
cols = 3
multi_array = [array.array('i', [826] * cols) for _ in range(rows)]
  • Numpy库
import numpy as np
my_array1 = np.array([2, 6, 12, 72, 132])# 多维
my_array2 = np.array([[2, 6, 12, 72, 132], [0, 2, 6, 56, 110]])

S3 问题:二维网格中的最小路径

给定一个 m × n m\times n m×n 的网格 g r i d grid grid,其中 g r i d [ i ] [ j ] grid[i][j] grid[i][j]表示到达该位置的代价。需要找到从 ( 0 , 0 ) (0, 0) (0,0) ( m − 1 , n − 1 ) (m-1, n-1) (m1,n1)的最小路径和,只能往下、右两个方向移动。现有网格如下:
在这里插入图片描述

求解思路
  1. 题目中的网格代价可以用二维数组表示:
grid_cost = [[3, 2, 2, 1], [4, 3, 1, 2], [1, 2, 4, 2], [3, 2, 3, 2]]
  1. 利用动态规划算法求解:
  • 状态定义:定义 d p [ i ] [ j ] dp[i][j] dp[i][j]为到达 ( i , j ) (i, j) (i,j)的最小路径和
  • 状态转移:从上方和左方转移到 ( i , j ) (i, j) (i,j),因此
    d p [ i ] [ j ] = g r i d [ i ] [ j ] + m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) dp[i][j]=grid[i][j]+min(dp[i−1][j],dp[i][j−1]) dp[i][j]=grid[i][j]+min(dp[i1][j],dp[i][j1])
  • 边界条件
    • 起始点: d p [ 0 ] [ 0 ] = g r i d [ 0 ] [ 0 ] dp[0][0] = grid[0][0] dp[0][0]=grid[0][0]
    • 第一行(根据条件,只能从左边过来): d p [ 0 ] [ j ] = d p [ 0 ] [ j − 1 ] + g r i d [ 0 ] [ j ] dp[0][j] = dp[0][j - 1] + grid[0][j] dp[0][j]=dp[0][j1]+grid[0][j]
    • 第一列(根据条件,只能从上边过来): d p [ i ] [ 0 ] = d p [ i − 1 ] [ 0 ] + g r i d [ i ] [ 0 ] dp[i][0] = dp[i - 1][0] + grid[i][0] dp[i][0]=dp[i1][0]+grid[i][0]
  • 结果:最终的结果为 d p [ m − 1 ] [ n − 1 ] dp[m-1][n-1] dp[m1][n1]
Python3程序
def minPathSum(grid):m, n = len(grid), len(grid[0])dp = [[0] * n for _ in range(m)]  # 存储最小路径和dp[0][0] = grid[0][0]# 初始化第一行for j in range(1, n):dp[0][j] = dp[0][j - 1] + grid[0][j]# 初始化第一列for i in range(1, m):dp[i][0] = dp[i - 1][0] + grid[i][0]# 填充 dp 表for i in range(1, m):for j in range(1, n):dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]# 获取最小路径和min_sum = dp[m - 1][n - 1]return min_sum# 示例输入
grid_cost = [[3, 2, 2, 1],[4, 3, 1, 2],[1, 2, 4, 2],[3, 2, 3, 2]
]min_sum  = minPathSum(grid_cost)
print(f"最小路径和: {min_sum}")# 最小路径和: 14
S4 问题:图像左右变换

给定一张图片,实现该图片的左右互换。
在这里插入图片描述

求解思路
  1. 用PIL包读取RGB模式的图片,然后利用numpy获得三维数组
  2. 可利用 l e f t _ p i x e l , r i g h t _ p i x e l = r i g h t _ p i x e l , l e f t _ p i x e l left\_pixel, right\_pixel = right\_pixel, left\_pixel left_pixel,right_pixel=right_pixel,left_pixel实现左右像素互换
  3. 三维数组利用matplotlib可视化
Python3程序
import numpy as np
from PIL import Image
import matplotlib.pyplot as pltdef flip_image_horizontally(imagepath):original_image = Image.open(imagepath).convert('RGB')# 读取为RGBrgb_data = np.array(original_image).transpose([2, 0, 1])challels, rows, cols = rgb_data.shape# 读取三维数组for c in range(challels):for i in range(rows):for j in range(cols // 2):# 交换左右像素的 RGB 值rgb_data[c][i][j], rgb_data[c][i][cols - 1 - j] = (rgb_data[c][i][cols - 1 - j], rgb_data[c][i][j])# 可视化plt.imshow(rgb_data.transpose([1, 2, 0]))plt.axis('off')plt.show()if __name__ == '__main__':imagepath = '你的图片路径'flip_image_horizontally(imagepath)

在这里插入图片描述

S5 问题:青蛙过河

一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内有可能放有一块石子,也有可能没有。

现给你石子的位置列表 s t o n e s stones stones(用单元格序号表示), 请判定青蛙能否成功过河(青蛙可以跳上石子,但是不可以跳入水中)即能否在最后一步跳至最后一块石子上。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃 1 个单位(即只能从单元格 1 跳至单元格 2 )。

如果青蛙上一步跳跃了 k k k个单位,那么它接下来的跳跃距离只能选择为 k − 1 、 k k - 1、k k1k k + 1 k + 1 k+1个单位。 另请注意,青蛙只能向前方(终点的方向)跳跃。

例如:给定 s t o n e s = [ 0 , 1 , 3 , 5 , 6 , 8 , 12 , 17 ] stones = [0,1,3,5,6,8,12,17] stones=[0,1,3,5,6,8,12,17],具体见下图:

在这里插入图片描述
按照如下方案跳跃:跳 1 个单位到第 2 块石子(位置1), 然后跳 2 个单位到第 3 块石子(位置3), 接着 跳 2 个单位到第 4 块石子(位置5), 然后跳 3 个单位到第 6 块石子(位置8), 跳 4 个单位到第 7 块石子(位置12), 最后,跳 5 个单位到第 8 个石子(即最后一块石子,位置17)。

求解思路
  1. 利用深度优先搜索(DFS)结合记忆化来解决这个问题
  • 状态表示
    使用一个递归函数 dfs(position, k),其中 position 是青蛙当前所在的位置,k 是上一次的跳跃距离。
  • 终止条件
    如果 position 是最后一块石头的位置,返回 True。
  • 递归
    • 对于每一次跳跃,尝试 k - 1、k 和 k + 1 的跳跃距离。
    • 检查新位置是否在 stones 中,并且是否可以到达。
  • 记忆化
    使用一个字典来存储已经访问过的状态,以避免重复计算。
Python3程序
def canCross(stones):stone_set = set(stones)memo = {}# DFS深度优先搜索def dfs(position, k):# 判断终止条件if position == stones[-1]:return True# 判断这个位置是否来过,并且是不是可以到达的if (position, k) in memo:return memo[(position, k)]# 遍历可能的跳跃单位for jump in [k - 1, k, k + 1]:if jump > 0:next_position = position + jump# 有石头,并且可到达if next_position in stone_set and dfs(next_position, jump):# 存储已经访问过的状态memo[(position, k)] = Truereturn Truememo[(position, k)] = Falsereturn Falsereturn dfs(stones[0], 0)if __name__ == '__main__':stones = [0, 1, 3, 5, 6, 8, 12, 17]print(canCross(stones))

结果

True

相关文章:

数据结构编程实践20讲(Python版)—01数组

本文目录 01 数组 arrayS1 说明S2 举例S3 问题:二维网格中的最小路径求解思路Python3程序 S4 问题:图像左右变换求解思路Python3程序 S5 问题:青蛙过河求解思路Python3程序 写在前面 数据结构是计算机科学中的一个重要概念,用于组…...

数据库实验2—1

10-1 查询重量在[40,65]之间的产品信息 本题目要求编写SQL语句&#xff0c; 检索出product表中所有符合40 < Weight < 65的记录。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product (Pid varchar(20), --商品编号PName varchar(50), --商品名称…...

现代前端框架实战指南:React、Vue.js、Angular核心概念与应用

随着互联网技术的发展&#xff0c;前端开发变得越来越复杂。 为了应对这些挑战&#xff0c;前端框架应运而生&#xff0c;它们提供了丰富的功能和工具&#xff0c;帮助开发者更高效地构建 和维护大型前端应用。前端框架是现代Web开发中不可或缺的一部分&#xff0c;它们提供了…...

MySQL --用户管理

文章目录 1.用户1.1用户信息1.2创建用户1.3删除用户1.4修改用户密码 2.数据库的权限2.1给用户授权2.2回收权限 如果我们只能使用root用户&#xff0c;这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理。 1.用户 1.1用户信息 MySQL中的用户&#xff0c;都存储在系…...

详解前驱图与PV操作

前驱图、PV操作 前驱图与PV操作的结合例子&#xff1a;两个进程的同步问题使用PV操作实现同步 前驱图的实际应用更复杂的场景示例示例1&#xff1a;前驱图与PV操作的结合1. 前驱图表示2. 使用信号量&#xff08;PV操作&#xff09;实现同步进程的执行逻辑&#xff1a; 3. 示例代…...

孩子来加拿大上学真的那么轻松吗?(上)

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 这是拼娃时代第三十一期节目&#xff0c;经过了一年的沉寂&#xff0c;拼娃时代在今年九月份终于恢复更新啦&#xff0c;JunJun老师也…...

【算法篇】二叉树类(1)(笔记)

目录 一、认识二叉树 1. 二叉树的种类 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉搜索树 &#xff08;4&#xff09;平衡二叉搜索树 2. 二叉树的存储方式 3. 二叉树的遍历方式 4. 二叉树的定义 二、Leet…...

《C++无锁编程:解锁高性能并发的新境界》

在当今的软件开发领域&#xff0c;并发编程的重要性日益凸显。随着多核处理器的普及&#xff0c;开发者们越来越需要利用并发来提高程序的性能和响应速度。而 C作为一种强大的编程语言&#xff0c;提供了多种技术来实现无锁编程&#xff0c;从而在并发环境下获得更高的性能和更…...

系统架构设计师教程 第9章 9.5 软件可靠性测试 笔记

9.5 软件可靠性测试 ★★★☆☆ 9.5.1 软件可靠性测试概述 软件测试者可以使用很多方法进行软件测试&#xff0c;如按行为或结构来划分输入域的划分测试&#xff0c; 纯粹随机选择输入的随机测试&#xff0c;基于功能、路径、数据流或控制流的覆盖测试等。 软件可靠性测试由可…...

如何使用ssm实现校园体育赛事管理系统的设计与实现+vue

TOC ssm713校园体育赛事管理系统的设计与实现vue 绪论 课题背景 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化。目前&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得…...

CSS 中的文本相关属性(line - height、font、letter - 属性、text - 属性)

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与行高的取值约定 行高与盒子高度的关系 font、letter -属性 、text -属性 font属性 letter -属性 text - 属性 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与…...

mobaxterm、vscode通过跳板机连接服务器

目标服务器&#xff1a;111.111.11.11 跳板机&#xff1a;100.100.10.10 1. mobaxterm通过跳板机连接服务器 1.1 目标服务器信息 1.2 跳板机信息 1.3 登录 点击登录&#xff0c;会输入密码&#xff0c;成功 参考&#xff1a;https://blog.csdn.net/qq_40636486/article/det…...

鸿萌数据恢复:iPhone 手机被盗后应采取哪些措施?警惕这些骗局

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 丢失昂贵的 iPhone 不仅会造成较大的经济损失&#xff0c;还…...

为了学习Python熬夜部署了Jupyter Notebook 6.x

文章目录 Docker拉取并构建容器安装部署jupyter对Jupyter使用过程问题总结1 没有代码提示怎么办&#xff1f;2 如果想切换python版本了怎么办&#xff1f;3 想在jupyter里面使用vim怎么办&#xff1f; 遇见的问题参考文章 怎么说&#xff0c;今天在学习Python的时候&#xff0c…...

docker-文件复制(docker cp:用于在Docker主机和容器之间拷贝文件或目录)

文章目录 1、把宿主机的文件复制到容器内部1.1、查询 宿主机 root 下的文件1.2、docker cp /root/anaconda-ks.cfg spzx-redis:/root1.3、查看 spzx-redis 容器 中/root目录下是否有 anaconda-ks.cfg 文件 2、把容器中的文件 复制 到宿主机中2.1、查看 spzx-redis 容器 / 下的文…...

guava里常用功能

guava 是 Google 提供的一个 Java 库&#xff0c;提供了很多实用的工具类和方法&#xff0c;可以帮助开发者更高效地编写代码。以下是一些常用的 Guava 工具类及其功能示例&#xff1a; 1. Lists 用于操作列表的工具类。 import com.google.common.collect.Lists;List<In…...

su 命令:一键切换用户身份、提高su命令安全性的建议

一、命令简介 ​su ​命令是 Linux 和 Unix 系统中的一个实用工具&#xff0c;用于切换用户身份。它允许当前登录用户在不退出登录会话的情况下&#xff0c;切换到另一个用户的身份。通常&#xff0c;su ​用于从普通用户切换到 root 用户&#xff0c;或从 root 用户切换到其他…...

观察者模式(发布-订阅模式)

用途&#xff1a; &#xff08;1&#xff09;可用于拦截过滤器 &#xff08;2&#xff09;订单创建成功后的一些后续逻辑&#xff08;消息提醒&#xff0c;订单打印&#xff0c;物品打包等&#xff09; &#xff08;3&#xff09;需要由统一调度中心调度的一系列任务等 消息…...

耦合微带线单元的网络参量和等效电路公式推导

文档下载链接&#xff1a;耦合微带线单元的网络参量和等效电路资源-CSDN文库https://download.csdn.net/download/lu2289504634/89583027笔者水平有限&#xff0c;错误之处欢迎留言&#xff01; 一、耦合微带线奇偶模详细推导过程 二、2,4端口开路 三、2端口短路、3端口开路 四…...

elasticsearch的Ingest Attachment插件的使用总结

安装 Ingest Attachment 插件 确保 Elasticsearch 已安装&#xff1a; 首先&#xff0c;请确保你已经安装并运行了 Elasticsearch。可以通过访问 http://localhost:9200 来检查是否正常运行。 安装插件&#xff1a; 使用以下命令在 Elasticsearch 中安装 Ingest Attachment 插…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...