Python(数据结构2)

常见数据结构

队列

队列(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out)

Python标准库中的queue模块提供了多种队列实现,包括普通队列、双端队列、优先队列等。

1 普通队列

queue.Queue 是 Python 标准库 queue 模块中的一个类,适用于多线程环境。它实现了线程安全的 FIFO(先进先出)队列。

Queue:普通队列,从队尾入列,从列头出列
 put():入列
 get():出列

2 双端队列

deque是一个双端队列的实现,它提供了在两端快速添加和移除元素的能力。

deque:双端队列,既可以在队尾进行入队和出队操作,也可以在对头进行出队和入队
append:从队尾入队
appendleft:在队头入队
pop:从队尾出队
popleft:从队头出队
appendleft和popleft组合使用时,相当于栈操作

3 优先队列

queue.PriorityQueue

queue.PriorityQueue 是 Python 标准库 queue 模块中的一个类,适用于多线程环境。它实现了线程安全的优先队列。

向队列中添加元素,元素是一个元组 (priority, item),其中 priority 是优先级,item 是实际的数据,prioriity越小优先级越高。

heapq

heapq 模块是 Python 标准库中的一个模块,提供了基于堆的优先队列实现。

heapq 模块不是线程安全的,适用于单线程环境。

heapq.heappush(heap,):向堆中添加元素,元素是一个元组 (priority, item)

heapq.heappop(heap):从堆中取出元素

二叉树
1 概念
  • 二叉树可以为空, 也就是没有结点.

  • 若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成。

2 特性

二叉树有几个比较重要的特性, 在笔试题中比较常见:

  • 一个二叉树第 i 层的最大结点数为:2^(i-1), i >= 1;

  • 深度为k的二叉树有最大结点总数为: 2^k - 1, k >= 1;

  • 对任何非空二叉树 T,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0 = n2 + 1。

3 特殊的二叉树

满二叉树(Full Binary Tree)

  • 在二叉树中, 除了最下一层的叶结点外, 每层节点都有2个子结点, 就构成了满二叉树.

完全二叉树(Complete Binary Tree)

  • 除二叉树最后一层外, 其他各层的节点数都达到最大个数.

  • 且最后一层从左向右的叶结点连续存在, 只缺右侧若干节点.

  • 满二叉树是特殊的完全二叉树.

4 二叉树的存储

二叉树的存储常见的方式是链表.

链表存储:

  • 二叉树最常见的方式还是使用链表存储.

  • 每个结点封装成一个Node, Node中包含存储的数据, 左结点的引用, 右结点的引用.

5 二叉树遍历

前序遍历(Pre-order Traversal)、中序遍历(In-order Traversal)和后序遍历(Post-order Traversal)是二叉树的三种基本遍历方式。

遍历规则:

前序遍历,按照以下顺序访问节点:根节点、左子树、右子树。

中序遍历,按照以下顺序访问节点:左子树、根节点、右子树。

后序遍历,按照以下顺序访问节点:左子树、右子树、根节点。

二叉查找树

二叉查找树(Binary Search Tree, BST)是一种特殊的二叉树,它具有以下性质:

  1. 每个节点都有一个键值(key)。

  2. 对于每个节点,其左子树中的所有节点的键值都小于该节点的键值。

  3. 对于每个节点,其右子树中的所有节点的键值都大于该节点的键值。

  4. 左子树和右子树也分别是二叉查找树。

  5. 二叉查找树不允许出现键值相等的结点。

代码实现:

1.创建二叉查找树节点;2.创建二叉查找树类;3 插入节点;4 查找节点;5.删除节点;6 中序遍历。

TreeNode 类定义了一个节点,它有三个属性:

  • key:存储节点的值。

  • left:指向节点的左子节点,默认为 None

  • right:指向节点的右子节点,默认为 None

BST 类定义了一个二叉搜索树,它有一个属性:

  • root:指向树的根节点,默认为 None

insert 方法用于插入一个新的节点到树中。如果树为空(即根节点 None),则创建一个新的节点作为根。如果树非空,则调用 _insert 方法来递归地插入节点。_insert 方法检查插入的键值与当前节点的键值,并相应地向左子树或右子树进行插入。

inorder_search 方法执行中序遍历,返回树中的所有键值。它首先初始化一个空的结果列表,然后调用 _inorder_search 辅助方法填充这个列表。_inorder_search 方法按照左子树 -> 当前节点 -> 右子树的顺序遍历整个树,并将每个节点的键值追加到结果列表中。

remove 方法用于从树中移除具有特定键值的节点。它通过调用 _remove 辅助方法来实现。_remove 方法是一个递归方法,它处理四种情况:

  1. 如果树为空,返回 None

  2. 如果键值小于当前节点的键值,则递归地移除左子树中的节点。

  3. 如果键值大于当前节点的键值,则递归地移除右子树中的节点。

  4. 如果键值等于当前节点的键值,那么根据当前节点的情况来处理:

    • 如果当前节点没有子节点,则返回 None

    • 如果当前节点只有一个子节点,则返回那个子节点。

    • 如果当前节点有两个子节点,则找到右子树中的最小值节点来替代当前节点,并递归地删除这个最小值节点。

_min_value_node 方法用于找到并返回从给定节点开始的子树中的最小值节点。它通过不断访问当前节点的左子节点直到到达最左边的叶子节点来实现。

Python包和模块

当使用Python编程时,包(Packages)和模块(Modules)是两个关键的概念,它们有助于组织、管理和复用代码。

模块(Modules)

一个.py 文件就是一个模块

  • 把相关功能的函数等放在一起有利于管理,有利于多人合作开发

  • 模块的分类

    1. 内置模块(在python3 程序内部,可以直接使用)

    2. 标准库模块(在python3 安装完后就可以使用的 )

    3. 第三方模块(需要下载安装后才能使用)

    4. 自定义模块(用户自己编写)

    5. 模块名如果要给别的程序导入,则模块名必须是 标识符

导入模块

import 模块名  [as 模块新名字1]

from 模块名 import 模块属性名 [as 属性新名]

from 模块名 import *

模块的内部属性

__file__  绑定模块的路径
__name__  绑定模块的名称
       如果是主模块(首先启动的模块)则绑定 '__main__'
       如果不是主模块则 绑定 xxx.py 中的 xxx 这个模块名

这样输入函数名可调用函数。

Python 常用的内建模块

1 random 模块

random.choice(seq):从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。

random.randrange (start, stop,step):从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1

输出一个范围在0到10的一个随机的偶数

random.random():随机生成下一个实数,它在[0,1)范围内。

如图,random函数还可与其他函数组合使用,该图表示,在0到1间生成1个数,然后乘10,且保留两位小数,最后加上5.

random.shuffle(list):将序列的所有元素随机排序,修改原list

uniform(x, y):随机生成实数,它在[x,y]范围内.

 random.randint(a,b):生产 a~b的随机整数

os 模块

os模块是Python标准库中的一部分,提供了一种与操作系统进行交互的方法。主要功能包括文件和目录的操作、路径处理、进程管理等。在使用os模块之前,我们需要先导入它:

os.getcwd():获取当前工作目录

os.chdir(path): 改变当前工作目录

os.listdir(path='.'): 返回指定目录下的所有文件和目录列表

os.mkdir(path): 创建目录

os.remove(path): 删除目录

os.path 模块

os.path.split(path):将文件路径和文件名切割,得到文件路径和文件名

os.path.exists(path):判断目录或者文件是否存在

os.path.isdir():判断指定路径是否是目录



os.path.isfile():判断指定路径是否是文件

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

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

相关文章

QT 机器视觉 (3. 虚拟相机SDK、测试工具)

本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景 更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员,希望了解2D、3D相机视觉相关操作…

QT打包Macosx应用发布App Store简易流程

1、QC里编译工程,生成Release版的的app文件; 2、运行macdeployqt把需要的文件打包进app文件中; % ~/Qt/5.15.0/clang_64/bin/macdeployqt {编译的app文件所在路径}/Release/xxxx.app 3、使用codesign对app进行签名,如果要发App…

Android平台RTSP转RTMP推送之采集麦克风音频转发

技术背景 RTSP转RTMP推送,好多开发者第一想到的是采用ffmpeg命令行的形式,如果对ffmpeg比较熟,而且产品不要额外的定制和更高阶的要求,未尝不可,如果对产品稳定性、时延、断网重连等有更高的技术诉求,比较…

网络:ARP的具体过程和ARP欺骗

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言ARP具体过程ARP欺骗原理总结 前言 本文仅作为ARP具体过程和ARP欺骗的知识总结 硬件类型 :指定发送和接受ARP包的硬件类型&am…

单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构

目录 一、合并两个有序链表 二、链表分割 三、链表的回文结构 u解题的总体思路: 合并两个有序链表:首先创建新链表的头节点(哨兵位:本质上是占位子),为了减少一些判断情况,简化操作。然后我们…

整理 【 DBeaver 数据库管理工具 】的一些基础使用

目录 连接设置切换工作空间SQL编辑器(写sql语句)打开方式新建查询(sql编辑器)打开写的 sql 查询(项目浏览器) 备份sql文件查看历史执行语句自动保存sql语句的文件(编辑器)关闭自动生…

Android Studio 依赖仓库地址

在Android Studio进行开发时,会遇到依赖库下载慢或者老项目使用的依赖库找不到的问题,折腾了两天,终于找到解决方法,使用 阿里云云效Maven,地址:仓库服务https://developer.aliyun.com/mvn/guide &#xff…

51单片机教程(五)- LED灯闪烁

1 项目分析 让输入/输出口的P1.0或P1.0~P1.7连接的LED灯闪烁。 2 技术准备 1、C语言知识点 1 运算符 1 算术运算符 #include <stdio.h>int main(){// 算术运算符int a 13;int b 6;printf("%d\n", ab); printf("%d\n", a-b); printf("%…

MySQL日志——针对实习面试

目录 MySQL日志MySQL有哪些日志&#xff1f;请解释一下MySQL的二进制日志&#xff08;Binlog&#xff09;的作用&#xff1f;复制&#xff08;Replication&#xff09;数据恢复&#xff08;Point-in-Time Recovery&#xff09; Binlog日志的三种格式是什么&#xff1f;如何使用…

STM32 HAL库 SPI驱动1.3寸 OLED屏幕

目录 参考硬件引脚与接线 点亮屏幕CubeMX 配置OLED 驱动程序代码 参考 基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏&#xff08;0.96寸 1.3寸通用&#xff09;0.96 oled HAL库驱动 SPI STM32SPI驱动0.96/1.3寸 OLED屏幕&#xff0c;易修改为DMA控制STM32驱…

qt QStatusBar详解

1、概述 QStatusBar是Qt框架提供的一个小部件&#xff0c;用于在应用程序窗口底部显示状态信息。它可以显示一些固定的文本和图标&#xff0c;并且可以通过API动态更新显示内容。QStatusBar通常是一个水平的窗口部件&#xff0c;能够显示多行文本内容&#xff0c;非常适合用于…

h5st参数解析

前言 之前4.8卡我&#xff0c;感觉过了&#xff0c;但是又好像失败了&#xff0c;所以这篇博客憋着没写&#xff0c;这次再次搞了一下&#xff0c;这次弄起来感觉挺简单的啊。 分析 1 20241102203105966; 2 fhhv55ehre91k4l8; 3 f06cc; 4 tk03w…

clickhouse运维篇(二):多机器手动部署ck集群

熟悉流程并且有真正部署需求可以看一下我的另一篇简化部署的文章&#xff0c;因为多节点配置还是比较麻烦的先要jdk、zookeeper&#xff0c;再ck&#xff0c;还有各种配置文件登录不同机器上手动改配置文件还挺容易出错的。 clickhouse运维篇&#xff08;三&#xff09;&#x…

导航栏小案例

实现类似于这样的效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>导航栏</title><style>*{margin: 0;padding: 0;}.div1{width: 100%;height: 60px;/* border: 1px solid blue; */background-color:rgb(…

ASP .NET CORE 6 在项目中集成WatchDog开源项目

概念 WatchDog是一个开源的项目&#xff0c;可以实现对.Net 应用程序和API实现实时应用日志和性能监控平台。可以实现实时记录和查看应用程序中的消息、事件、HTTP请求和响应&#xff0c;以及运行时捕获的异常&#xff0c;有效帮助开发人员去排查应用异常&#xff0c;提升开发效…

四、k8s快速入门之Kubernetes资源清单

kubernetes中的资源 ⭐️ k8s中所有的内容都抽象为资源&#xff0c;资源实列化之后&#xff0c;叫做对象 1️⃣名称空间级别 ⭐️ kubeadm在执行k8s的pod的时候会在kube-system这个名称空间下执行&#xff0c;所以说当你kubectl get pod 的时候是查看不到的查看的是默认的po…

无人机之集群控制方法篇

无人机的集群控制方法涉及多个技术和策略&#xff0c;以确保多架无人机能够协同、高效地执行任务。以下是一些主要的无人机集群控制方法&#xff1a; 一、编队控制方法 领航-跟随法&#xff08;Leader-Follower&#xff09; 通过设定一架无人机作为领航者&#xff08;长机&am…

给大家推荐一本书《GPT时代人类再腾飞》

大家好&#xff0c;我是袁庭新。给大家推荐一本书——《GPT时代人类再腾飞》。 先给大家介绍一位顶级大佬——里德霍夫曼。他是著名互联网企业家&#xff0c;领英联合创始人&#xff1b;知名风险投资者&#xff0c;Open AI早期投资人&#xff1b;《纽约时报》畅销书作者、播客…

法律智能助手:开源NLP系统助力法律文件高效审查与检索

一、系统概述 思通数科AI平台是一款融合了自然语言处理和多标签分类技术的开源智能文档分类工具&#xff0c;特别适用于法律行业。平台采用深度学习的BERT模型来进行特征提取与关系抽取&#xff0c;实现了精准的文档分类和检索。用户可以在线训练和标注数据&#xff0c;使系统…

redis模板的应用:自定义redisTemplate序列化规则 (RedisTemplate和StringRedisTemplate)

文章目录 引言I 基础知识redis对key和value使用序列化方式RedisTemplate<Object, Object>自定义redisTemplate序列化规则RedisTemplate<String, String>II 存储自定义对象redisTemplate存储自定义对象StringRedisTemplate存储自定义对象引言 StringRedisTemplate只…