Python中的数据结构

news2025/1/17 5:48:33

一.堆

堆的建立可以通过导入heapq库来实现

在Python中建立的是最小堆 即heap[k]<=heap[2*k+1]and heap[k]<=heap[2*k+2]

下面是一些 堆使用的方法

heapq.heappush([],加入的元素)   
heapq.heappop(heap)弹出最小的元素  
heapq.nlargest(3,heap)返回最大的三个元素 
heapq.nsmallest(3,heap)返回最小的三个元素  
heapq.heapify(my)  #自动将列表装换成堆

例子:

import heapq ,random

data=list(range(10))
random.shuffle(data)
print(data)
#建堆
heap=[]
for i in data:
    heapq.heappush(heap,i)
heapq.heappush(heap,99)#添加元素99
print(heap)

print(heapq.heappop(heap))  #弹出最小的元素

heapq.heapreplace(heap,3)#替换堆中最小的元素值,并自动重新建堆

print(heapq.nlargest(3,heap)) #返回最大的三个元素
print(heapq.nsmallest(3,heap)) #返回最小的三个元素

my=[2,0,4,3,12,15,5]
heapq.heapify(my)  #自动将列表装换成堆
print(my)

二.队列

通过导入queue模块实现

下面是一些 队列使用的方法

q=queue.Queue(6) #实例化队列   
q.put(1)  #元素入队  
q.get()出队 
q.empty()判断队列是否为空
q.full()判断队列是否为满
import queue

q=queue.Queue(6) #实例化队列

q.put(1)  #元素入队
q.put(3)
q.put(10)

print(q.full())

print(q.get())

3.链表

可以通过列表来模拟.不过多讲解

4.二叉树

自己实现

class TreeNode:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None

class BinaryTree:
    def __init__(self):
        self.root = None

    def insert(self, key):
        if self.root is None:
            self.root = TreeNode(key)
        else:
            self._insert_recursive(self.root, key)

    def _insert_recursive(self, current_node, key):
        if key < current_node.key:
            if current_node.left is None:
                current_node.left = TreeNode(key)
            else:
                self._insert_recursive(current_node.left, key)
        else:
            if current_node.right is None:
                current_node.right = TreeNode(key)
            else:
                self._insert_recursive(current_node.right, key)

    def search(self, key):
        return self._search_recursive(self.root, key)

    def _search_recursive(self, current_node, key):
        if current_node is None or current_node.key == key:
            return current_node
        elif key < current_node.key:
            return self._search_recursive(current_node.left, key)
        else:
            return self._search_recursive(current_node.right, key)

    def inorder_traversal(self):
        return self._inorder_recursive(self.root)

    def _inorder_recursive(self, current_node):
        result = []
        if current_node:
            result.extend(self._inorder_recursive(current_node.left))
            result.append(current_node.key)
            result.extend(self._inorder_recursive(current_node.right))
        return result

# 使用示例
tree = BinaryTree()
tree.insert(5)
tree.insert(3)
tree.insert(7)
tree.insert(2)
tree.insert(4)
tree.insert(6)
tree.insert(8)

print(tree.inorder_traversal())  # 输出:[2, 3, 4, 5, 6, 7, 8]

# 搜索示例
result = tree.search(4)
if result:
    print(f"Key 4 found: {result.key}")
else:
    print("Key 4 not found")

实现说明:

  1. TreeNode类

    • 表示二叉树中的每个节点,具有一个 key 属性存储节点的值,以及 left 和 right 属性分别指向左子节点和右子节点。
  2. BinaryTree类

    • 使用 root 属性表示树的根节点。
    • insert(key) 方法用于插入新的节点到二叉树中。
    • _insert_recursive(current_node, key) 是递归插入方法,根据节点值大小决定向左子树或右子树插入新节点。
    • search(key) 方法用于搜索特定值的节点。
    • _search_recursive(current_node, key) 是递归搜索方法,根据节点值大小在左子树或右子树中搜索目标节点。
    • inorder_traversal() 方法实现中序遍历,返回一个按升序排列的节点值列表。
    • _inorder_recursive(current_node) 是递归实现的中序遍历方法。
  3. 使用示例

    • 创建一个二叉搜索树(BST),插入一些节点并进行搜索和遍历操作。
    • 输出示例展示了中序遍历的结果,以及如何搜索特定的节点。

这是一个基本的二叉树实现,可以根据需要扩展添加其他操作如删除节点、前序遍历、后序遍历等。

当我们对一个简单的二叉搜索树进行中序遍历时,可以通过以下步骤演示 _inorder_recursive() 方法的执行过程 

初始调用

首先,我们从根节点 5 开始调用 _inorder_recursive() 方法:

  1. 调用 _inorder_recursive(5)

    • current_node 是 5
    • result 初始化为空列表 []
  2. 处理左子树 _inorder_recursive(3)

    • current_node 是 3
    • 调用 _inorder_recursive(3)
  3. 处理左子树 _inorder_recursive(2)

    • current_node 是 2
    • 调用 _inorder_recursive(2)
  4. 返回空列表 [2]_inorder_recursive(3)

    • 现在 result 是 [2]
    • 添加 3,返回 [2, 3] 到 _inorder_recursive(5)
  5. 处理根节点 5

    • 现在 result 是 [2, 3]
    • 添加 5,成为 [2, 3, 5]
  6. 处理右子树 _inorder_recursive(7)

    • current_node 是 7
    • 调用 _inorder_recursive(7)
  7. 处理左子树 _inorder_recursive(6)

    • current_node 是 6
    • 调用 _inorder_recursive(6)
  8. 返回空列表 [6]_inorder_recursive(7)

    • 现在 result 是 [6]
    • 添加 7,返回 [6, 7] 到 _inorder_recursive(5)
  9. 处理根节点 5

    • 现在 result 是 [2, 3, 5, 6, 7]
  10. 处理右子树 8

    • current_node 是 8
    • 调用 _inorder_recursive(8)
  11. 返回空列表 [8]_inorder_recursive(7)

    • 现在 result 是 [6, 7, 8]
    • 返回 [2, 3, 5, 6, 7, 8] 到 _inorder_recursive(5)
  12. 最终结果

    • 最终返回 [2, 3, 4, 5, 6, 7, 8],这是二叉搜索树中序遍历的结果。

5.有向图

from collections import defaultdict


class WeightedGraph:
    def __init__(self):
        self.graph = defaultdict(list)

    def add_edge(self, u, v, weight):
        self.graph[u].append((v, weight))
        # Uncomment below for undirected graph
        # self.graph[v].append((u, weight))

    def print_graph(self):
        for node in self.graph:
            print(f"{node} -> {self.graph[node]}")


# 创建一个新的带权图实例
graph = WeightedGraph()

# 添加带权边
graph.add_edge(0, 1, 4)
graph.add_edge(0, 2, 2)
graph.add_edge(1, 3, 1)
graph.add_edge(2, 3, 3)

# 打印邻接表表示的带权图
graph.print_graph()

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

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

相关文章

Vue笔记-vue中使用JS创建的函数

主要是公司对前端要求不高&#xff0c;能解决问题就行了&#xff0c;前端不太熟&#xff0c;用js这种处理起来方便&#xff0c;在此记录下。 在src中创建一个api目录&#xff0c;新建custom.js export const getDivHeightByClass (className) > {let divElements docume…

Java面试题--JVM大厂篇之G1 GC的分区管理方式如何减少应用线程的影响

目录 引言: 正文: 1. 区域划分&#xff08;Region&#xff09; 2. 并行和并发回收 3. 区域优先回收&#xff08;Garbage First&#xff09; 4. 可预测的停顿时间 5. 分阶段回收 6. 复制和压缩 实际效果: 场景举例 1. 减少单次GC的影响 2. 支持高并发环境 3. 优…

设计模式-代理模式和装饰者模式

二者都是结构型的设计模式. 1.代理模式 1.1定义 为其他对象提供一种代理以控制对这个对象的访问. 代理从code实现方面分为静态代理和动态代理两种&#xff1b; 从适用范围来看,分为远程代理,虚拟代理,保护代理,智能引用几种. 远程代理:为某个对象在不同的内存地址空间提供…

张小凡砍灵竹

题目 张小凡刚入青云门时&#xff0c;拜入大竹峰田不易门下&#xff0c;师父要求他上山砍灵竹锻炼体力。第一天他砍了1根&#xff0c;之后的九天他分别砍了2&#xff0c;4&#xff0c;5&#xff0c;5&#xff0c;8&#xff0c;7&#xff0c;9&#xff0c;12&#xff0c;2根&am…

【Python】已解决:AttributeError: ‘Series‘ object has no attribute ‘sortlevel‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;AttributeError: ‘Series‘ object has no attribute ‘sortlevel‘ 一、分析问题背景 在数据分析和处理过程中&#xff0c;Pandas库是一个非常强大的工具。它…

Tomcat的安装和虚拟主机和context配置

一、 安装Tomcat 注意&#xff1a;安装 tomcat 前必须先部署JDK 1. 安装JDK 方法1&#xff1a;Oracle JDK 的二进制文件安装 [rootnode5 ~]# mkdir /data [rootnode5 ~]# cd /data/ [rootnode5 data]# rz[rootnode5 data]# ls jdk-8u291-linux-x64.tar.gz [rootnode5 data]…

基于springboot+vue+uniapp的语言课学习系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

数据恢复篇:计算机格式化后如何恢复照片

您想了解如何从已格式化的笔记本电脑或台式机中恢复已删除的照片吗&#xff1f;这篇文章解释了如何使用最佳格式照片恢复软件来做到这一点。格式化计算机后&#xff0c;您可以通过简单的步骤恢复已删除的图像。 将照片保存在笔记本电脑或 PC 硬盘上是很常见的。与相机存储卡和…

02-《石莲》

石 莲 石莲&#xff08;学名&#xff1a;Sinocrassula indica A.Berger&#xff09;&#xff0c;别名因地卡&#xff0c;为二年生草本植物&#xff0c;全株无毛&#xff0c;具须根。花茎高15-60厘米&#xff0c;直立&#xff0c;常被微乳头状突起。茎生叶互生&#xff0c;宽倒披…

“吃饭大学”!中国大学食堂排行TOP10(含西电)

同学们们&#xff0c;考研择校考虑的因素除了学术&#xff0c;地理位置等方面&#xff0c;你们还会考虑哪些因素呢&#xff1f;小研作为一个吃货&#xff0c;必定会考虑的一个因素当然是大学的食堂美食啊~ 那中国超级好吃的大学食堂在哪&#xff1f;一起来看看有没有你的目标院…

文华均线交叉多空买卖点-支撑压力自动画线-波浪AB画线指标公式

A1:MA(C,5); A2:MA(C,10); MA1:MA(A1,15); MA2:MA(A2,15); JC:CROSS(MA1,MA2); SC:CROSSDOWN(MA1,MA2); N:1; JC1:BARSLAST(JC)N; SC1:BARSLAST(SC)N; VERTLINE(SC,COLORRED),DOT; VERTLINE(JC,COLORGREEN),DOT; H1:VALUEWHEN(SC,HHV(H,JC1)),COLORRED;//当前死叉到…

(4.2)Sourcegraph(Chrome插件)——github实现源码阅读

一、下载 下载方式参考&#xff1a;如何安装 Chrome 插件&#xff1f;以 Show_Rank 为例 下载链接一&#xff1a;从Chrome应用商店直接搜索&#xff0c;https://chromewebstore.google.com/detail/sourcegraph/dgjhfomjieaadpoljlnidmbgkdffpack?utm_sourceext_app_menu 如…

“论单元测试方法及应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 1、概要叙述你参与管理和开发的软件项目,以吸你所担的主要工作。 2、结给你参与管理和开发的软件项目&#xff0c;简要叙述单元测试中静态测试和动态测试方法的基本内容。 3、结给你惨与管理和研发的软件项目,体阐述在玩测试过程中,如何确定白盒测试的覆盖标准,及如…

【SQL】已解决:SQL错误(208):对象名‘STRING_SPLIT‘无效

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;SQL错误&#xff08;208&#xff09;&#xff1a;对象名‘STRING_SPLIT‘无效 在使用SQL Server进行数据库操作时&#xff0c;遇到错误&#xff08;208&#xff…

详细配置SQL Server的链接服务器(图文操作Mysql数据库)

目录 前言1. MySQL ODBC 驱动2. 配置 SQL Server 链接服务器3. 彩蛋前言 此处配置以及安装没有什么理论知识 所以直奔主题,跟着以下步骤配置安装即可 需求:准备在10.197.0.110中链接外部的10.197.0.96的mysql数据源 已默认在10.197.0.96中安装了MySQL数据库并且知道其连接信…

隐私计算实训营第二期第12基于隐语的VisionTransformer框架

01 MPCViT&#xff1a;安全且高效的MPC友好型 Vision Transformer架构 总体框架&#xff1a; 首先分析了ViT产生较大延时的原因&#xff0c;思考能否去除这些操作。 然后&#xff0c;对比不同的注意力机制&#xff0c;发现它们中有的具有很好的效率&#xff0c;有的则具有很…

WebRtc实现1V1音视频通话

简介 WebRTC&#xff0c;名称源自网页实时通信&#xff08;Web Real-Time Communication&#xff09;的缩写&#xff0c;是一个支持网页浏览器进行实时语音通话或视频聊天的技术&#xff0c;是谷歌 2010 年以 6820 万美元收购 Global IP Solutions 公司而获得的一项技术。 WebR…

YOLO系列笔记(十八)—— YOLOv1和YOLOv2总结与对比

YOLOv1和的v2总结与对比 YOLOv1主要思想算法架构主干网络损失函数 训练过程网络预测主要成果优化方向 YOLOv2算法架构主干网络损失函数 相较之前的优化添加Batch Normalization引入锚框&#xff08;Anchor Boxes&#xff09;机制引入DarkNet-9多尺度输入训练 网络训练第一阶段&…

数据结构--队列(图文)

队列是一种特殊的线性表&#xff0c;其核心特点是先进先出。 概念及特点&#xff1a; 概念 队列是一种只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的线性表。进行插入操作的一端被称为队尾&#xff08;Tail 或 Rear&#xff09;&#xff0c;进行删除…

使用ChatGLM3自带的网页客户端

【图书推荐】《ChatGLM3大模型本地化部署、应用开发与微调》-CSDN博客 通过简单的代码领略一下ChatGLM3大模型_chatglm3 history怎么写-CSDN博客 除了我们上面使用自定义的gradio组件完成网页客户端的搭建&#xff0c;智谱AI的ChatGLM3在创建之初就本着“方便用户&#xff0c…