使用Python实现几种底层技术的数据结构

使用Python实现几种底层技术的数据结构

数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系。

Python实现了许多常见的底层数据结构,以下是其中几种常见的:

列表(List):列表是Python中最常用的数据结构之一,它可以存储任意类型的元素,并且可以动态地改变大小。列表使用方括号 [] 来表示,可以通过索引访问和修改元素。

元组(Tuple):元组与列表类似,但是元组是不可变的,即创建后不能修改。元组使用圆括号 () 来表示,可以通过索引访问元素。

字典(Dictionary):字典是一种键值对的数据结构,可以用来存储和访问具有唯一键的值。字典使用花括号 {} 来表示,键和值之间使用冒号 : 分隔。

集合(Set):集合是一种无序且不重复的数据结构,可以用来进行集合运算,如并集、交集、差集等。集合使用花括号 {} 来表示,元素之间使用逗号分隔。

字符串(String):字符串是一种由字符组成的序列,可以用来表示文本。字符串是不可变的,即创建后不能修改。字符串可以使用单引号或双引号来表示。

在Python中,虽然内置的类型如列表、字典、集合和元组可以用于大多数应用,但有时我们可能需要实现更具体的底层数据结构,例如栈、队列、链表、二叉树等。以下是这些数据结构的简单Python实现:

★栈(Stack)

栈是一种后进先出(LIFO)的数据结构。只允许在栈顶进行插入(push)和删除(pop)操作。在Python中可以使用列表来实现一个简单的栈。

class Stack:def __init__(self):self.items = []def is_empty(self):return not self.itemsdef push(self, item):self.items.append(item)def pop(self):if not self.is_empty():return self.items.pop()raise IndexError("pop from empty stack")def peek(self):if not self.is_empty():return self.items[-1]raise IndexError("peek from empty stack")def size(self):return len(self.items)#使用Stack类创建一个栈对象,并进行操作:
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.size())    # 输出:3
print(stack.pop())     # 输出:3
print(stack.peek())    # 输出:2
print(stack.is_empty())     # 输出:False

★队列(Queue)

队列是一种先进先出(FIFO)的数据结构。只允许在队尾进行插入(enqueue)操作,在队头进行删除(dequeue)操作。在Python中可以使用列表来实现一个简单的队列。

class Queue:def __init__(self):self.items = []def is_empty(self):return not self.itemsdef enqueue(self, item):self.items.insert(0, item)def dequeue(self):if not self.is_empty():return self.items.pop()raise IndexError("dequeue from empty queue")def size(self):return len(self.items)#使用Queue类创建一个队列对象,并进行操作:
queue = Queue()
queue.enqueue('a')
queue.enqueue('b')
queue.enqueue('c')
print(queue.size())    # 输出:3
print(queue.dequeue())     # 输出:'a'
print(queue.is_empty())    # 输出:False

★链表(Linked List)

链表是一种由节点组成的序列,每个节点包含数据和指向下一个节点的引用。单链表(Singly Linked List)是一种常见的链表,由一系列节点组成,每个节点包含两个部分:数据和指向下一个节点的引用。

在Python中,引用可以被看作是自动管理的指针,它们指向对象的内存地址,但这一切都是在Python的内部机制中自动处理的。

在Python中可以使用类来实现一个简单的链表。

 下面是一个简单的示例,展示了如何在Python中实现单链表:

class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef is_empty(self):return self.head is None        def append(self, data):if not self.head:self.head = Node(data)else:current = self.headwhile current.next:current = current.nextcurrent.next = Node(data)def display(self):elements = []current = self.headwhile current:elements.append(current.data)current = current.nextreturn elementsdef remove_node(self, data):if not self.is_empty():current_node = self.headif current_node.data == data:self.head = current_node.nextelse:while current_node.next:if current_node.next.data == data:current_node.next = current_node.next.nextbreakcurrent_node = current_node.nextdef get_size(self):size = 0current_node = self.headwhile current_node:size += 1current_node = current_node.nextreturn size#使用LinkedList类创建一个链表对象,并进行操作:
linked_list = LinkedList()
print(linked_list.is_empty())    # 输出:Truelinked_list.append(1)
linked_list.append(2)
linked_list.append(3)print(linked_list.display())   # 输出[1, 2, 3]print(linked_list.get_size())    # 输出:3linked_list.remove_node(2)
print(linked_list.get_size())    # 输出:2

★二叉树(Binary Tree)

二叉树是每个节点最多有两个子节点的树结构。二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树( 即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。

class TreeNode:def __init__(self, data):self.data = dataself.left = Noneself.right = Noneclass BinaryTree:def __init__(self, root):self.root = TreeNode(root)def insert_left(self, current_node, data):if current_node.left is None:current_node.left = TreeNode(data)else:new_node = TreeNode(data)new_node.left = current_node.leftcurrent_node.left = new_nodedef insert_right(self, current_node, data):if current_node.right is None:current_node.right = TreeNode(data)else:new_node = TreeNode(data)new_node.right = current_node.rightcurrent_node.right = new_node# 用于演示的简单遍历方法def preorder_traversal(self, start, traversal=[]):"""Root -> Left -> Right"""if start:traversal.append(start.data)self.preorder_traversal(start.left, traversal)self.preorder_traversal(start.right, traversal)return traversal#使用 BinaryTree类创建一个二叉树对象,并进行操作
# 创建一个二叉树对象
binary_tree = BinaryTree(1)# 插入左子节点
binary_tree.insert_left(binary_tree.root, 2)
# 插入右子节点
binary_tree.insert_right(binary_tree.root, 3)# 插入左子节点的左子节点
binary_tree.insert_left(binary_tree.root.left, 4)
# 插入左子节点的右子节点
binary_tree.insert_right(binary_tree.root.left, 5)# 插入右子节点的左子节点
binary_tree.insert_left(binary_tree.root.right, 6)
# 插入右子节点的右子节点
binary_tree.insert_right(binary_tree.root.right, 7)# 进行先序遍历
print(binary_tree.preorder_traversal(binary_tree.root))

上述这些代码示例,演示了如何使用Python实现栈、队列、链表和二叉树的基础版本,实际应用中可能需要更多的功能和错误处理。这些数据结构在算法和数据处理中都有广泛的应用,掌握它们的实现原理和使用方法对于进一步提升编程能力十分重要。

附录

你应该了解的8种常见数据结构 https://www.toutiao.com/article/6799768009498952203/

算法基础系列 https://blog.csdn.net/cnds123/article/details/120061638

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

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

相关文章

千字文||无聊又数了一下千字文字数

千字文的字数去除标点符号真的整整一千个不多的不少 该文章无技术含量,仅三字经原文,学技术的同学可以止步了 千字文(原文) 【作者】周兴嗣 【朝代】南北朝 天地玄黄,宇宙洪荒。 日月盈昃,辰宿列张。 寒来…

Python 进程和线程详解(multiprocessing、threading)

文章目录 1 概述1.1 进程 VS 线程1.2 优缺点 2 进程2.1 三个步骤2.2 多进程2.3 带参数2.3.1 元组参数 args2.3.2 字典参数 kwargs 2.4 获取进程编号2.5 设置进程守护 3 线程3.1 三个步骤3.2 多线程3.3 带参数2.3.1 元组参数 args2.3.2 字典参数 kwargs 2.4 获取线程编号2.5 设置…

UE4基础篇十七:分析性能

一、性能瓶颈定位 原文地址:小能猫吃牙膏:UE4 性能 - (一)瓶颈定位 P.S. 对于某个具体问题,我个人偏向于遵循 WHY → WHAT → HOW 的思考方法(重要性逐级递减) 加以理解。因为如果找不到做某件事情的意义(WHY)所在,或是对这件事情本身的定义(WHAT)都模棱两可,那么即便经…

【经验之谈·高频PCB电路设计常见的66个问题】

文章目录 1、如何选择PCB 板材?2、如何避免高频干扰?3、在高速设计中,如何解决信号的完整性问题?4、差分布线方式是如何实现的?5、对于只有一个输出端的时钟信号线,如何实现差分布线?6、接收端差…

特斯拉开启“涨涨涨”模式,一个月宣布涨价4次

KlipC报道:11月21日特斯拉中国官网上调了Model Y长续航全轮驱动版售价,一个月内,特斯拉进行第四次价格调整。 对此特斯拉将近期涨价的原因解释为 这次涨价相对于今年8月份的降价实际上属于‘价格回调’,一方面是因为特斯拉销量好&…

docker部署jdk21的镜像

docker Docker是一种开放源代码软件,可以帮助开发人员更轻松地创建、部署和运行应用程序。它是一种容器化技术,可以将应用程序及其依赖项打包在一个容器中,从而使应用程序更加便携和可移植。Docker将操作系统、应用程序和硬件虚拟化进行了彻底…

LeetCode算法心得——爬楼梯(记忆化搜索)

大家好,我是晴天学长,第二个记忆化搜索练习,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1)爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或…

Nacos和Eureka的区别

目录 配置: 区别: ephemeral设置为true时 ephemeral设置为false时(这里我使用的服务是order-service) 1. Nacos与eureka的共同点 都支持服务注册和服务拉取 都支持服务提供者心跳方式做健康检测 2. Nacos与Eu…

手把手带你在AutoDL上部署InternLM-Chat-7B Transformers

手把手带你在AutoDL上部署InternLM-Chat-7B Transformers 调用 项目地址:https://github.com/KMnO4-zx/self_llm.git 如果大家有其他模型想要部署教程,可以来仓库提交issue哦~ 也可以自己提交PR! InternLM-Chat-7B Transformers 部署调用 环…

演示命令执行漏洞无回现如何渗透

演示命令执行漏洞无回现如何渗透 在DNSlog 获取一个域名 使用dvwa中的命令执行来ping此域名 执行后在DNSlog收到解析,证明命令执行成功

【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编

🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀直接操作寄存器点亮LED灯🏀地址空间🏀ARM内部的寄存…

KNN(k近邻法)算法理论和实战

KNN概念 k近邻法(k-nearest neighbor,k-NN)是一种基本分类与回归方法。 k近邻法的输入为实例的特征向量对应于特征空间的点;输出为实例的类别,可以取多类。 k近邻法假设给定一个训练数据集,其中的实例类…

Freeswitch中mod_commonds

mod_commands 整理来自Freeswitch官网 Table of Contents (click to expand) 0. About1. Usage 1.1 CLI1.2 API/Event Interfaces1.3 Scripting Interfaces1.4 From the Dialplan2. Format of returned data3. Core Commands 3.1 acl  3.1.1 Syntax3.1.2 Examples3.2 …

pytorch中gather函数的理解

pytorch函数gather理解 torch.gather(input, dim, index, outNone) → Tensor Parameters: input (Tensor) – 源张量dim (int) – 索引的轴index (LongTensor) – 聚合元素的下标(index需要是torch.longTensor类型)out (Tensor, optional) – 目标张量 公式含义 这个函数的…

短视频配音软件有哪些?这些常用的短视频配音软件

短视频行业近年来发展得很快,几乎闯入了我们每个现代人的生活,它以其独有的特点和乐趣,也收获了大批短视频爱好者,配音是短视频创作过程中不可或缺的环节,今天,我们就来聊聊短视频配音及好用的配音软件。 短…

一文读懂 Linux 网络 IO 模型

文章目录 1.从一个问题说起2.多进程模型3.多线程模型4.I/O 多路复用5.select、poll、epoll 的区别?5.1 select5.2 poll5.3 epoll5.4 两种事件触发模式 参考文献 1.从一个问题说起 互联网发展历史上,曾经有一个著名的问题:C10K 问题。 C 是 …

【SpringBoot】 环境准备

一.SpringBoot准备 1.下载idea 社区版 2021.1 - 2022.1.4 专业版 无要求 2.Maven 是一个工具,和Java没有关系 . 主要功能是项目构建和依赖管理. 项目构建 上述对应的都是maven命令 . 依赖管理 添加坐标之后,点击刷新,右侧就会载入依赖. Maven还有依赖传递和依赖排除功…

【Mysql学习笔记】- 2 多表查询

一、加强查询 where子句,oder by子句 -- 查询加强 -- ■ 使用where子句 -- ?如何查找1992.1.1后入职的员工 -- 老师说明: 在mysql中,日期类型可以直接比较, 需要注意格式 SELECT * FROM empWHERE hiredate > 1992-01-01 -- ■ 如何使用like操作符…

局域网文件共享神器:Landrop

文章目录 前言解决方案Landrop软件界面手机打开效果 软件操作 前言 平常为了方便传文件,我们都是使用微信或者QQ等聊天软件,互传文件。这样传输有两个问题: 必须登录微信或者QQ聊天软件。手机传电脑还有网页版微信,电脑传手机比…

Linux 环境配置小白入门

Linux从 全栈开发centOS 7 到 运维 一 Linux 入门概述1.1 操作系统1.2 Linux 简介1.3 Linux 系统组成1.4 Linux 发行版1.5 Linux 应用领域1.6 Linux vs Windows 二 虚拟机2.1 虚拟机介绍2.2 VMware WorkStation 安装2.3 VMware WorkStation 配置检查2.3 安装 CentOS 72.3.1 安装…