python链表和树实验报告_关于Python实现树结构和链表结构的一点想法

关于Python实现树结构和链表结构的一点想法

Python由于内置的数据结构具有很高的灵活性,所以可以用很多种方式来构建树、图、链表等结构

1. 树的Python实现

python自然可以使用class来创建Node结点类和Trie类,然后通过left和right属性保存Node结点来实现树

Python也可以使用字典来嵌套生成树,字典的Key作为当前结点,字典的Value为子树。

但需要注意的是,字典的value是一个字典,那么这个value字典中可以有多个Key,那么每个Key之间是互相为兄弟关系的。

同理,如列表等数据结构,也可以通过嵌套来生成树

在使用字典创建树时,可以重复利用dict的方法setdefault(key,default),如果key存在,则返回value,若不存在,则插入key:default并返回default

--------------------------

比较有意思的是对于树而言,在哪里存他的数据会有很多的不同,对于不同场景酌情实现

假设是使用class实现的字母前缀树,那么可以把字母值保存在当前Node结点的value中,那么这样匹配一个单词的时候,需要遍历所有的子节点找到对应值是否存在,这样在某一层上就多花了k的时间(由于字典自带哈希,所以字典实现的前缀树查找会很快,是O(1)的时间)

也可以把字母值保存在连向子结点的连线上

由于字母前缀树每个结点最多只有26种取值,所以可以提前存一个初始化为26个None的列表,如果在b的位置有值,那么在第二个位置存子结点的Node,这样就实现了把字母值存在连向子结点的连线上。

同时,匹配一个单词的时候,直接来判断这个位置是None还是存在Node结点就可以直接找到下一个结点了,也是O(1)的时间,但是如果树很深,但是很窄的话,这样会浪费许多空间

所以针对不同的场景需求,可以自行选择存储数据的位置,有不同的效果。

利用字典实现树代码如下

#利用字典实现前缀树

trie = {}

# 建立字典实现的字母前缀树

for word in words:

cur = trie

for alpha in word:

cur=cur.setdefault(alpha,{})

2. 链表的Python实现

python本身的列表已经很好用了,在python的标准库中没有链接列表的实现,如果需要大量插入和删除还是需要手动实现一下的,可以实现O(k)的增删查找复杂度

链表实现自然也可以用class来创建Node结点类和Trie类,在Trie类中创建head与tail的Node对象,就可以进行追踪了

如果需要O(1)的查找以及增删复杂度的链表,那么需要配合哈希与双向链表实现、那么在Trie类中还需要添加一个dict哈希来进行节点位置的追踪,key为Node节点的Key(Node节点属性有Key、value、next、pre),Value为该Node节点

#配合哈希与双向链表实现O(1)的查找以及增删复杂度

class Node:

def __init__(self,key,value):

self.key=key

self.value=value

self.next=None

self.pre=None

class LRUCache:

def __init__(self, capacity: int):

self.dic=dict()

self.capacity=capacity

self.size=0

self.head=Node(-1,-1)

self.tail=Node(-1,-1)

self.head.next=self.tail

self.tail.pre=self.head

def get(self, key: int) -> int:

if(key in self.dic):

new_node = Node(key, self.dic[key].value)

# 删除旧节点

del_node = self.dic[key]

del_node.pre.next = del_node.next

del_node.next.pre = del_node.pre

# 添加新节点到头部

new_node.pre = self.head

new_node.next = self.head.next

self.head.next.pre = new_node

self.head.next = new_node

self.dic[key]=new_node

return self.dic[key].value

else:

return -1

def put(self, key: int, value: int) -> None:

new_node = Node(key, value)

# 添加新节点到头部

new_node.pre = self.head

new_node.next = self.head.next

self.head.next.pre = new_node

self.head.next = new_node

if(key in self.dic):

del_node=self.dic[key]

del_node.pre.next=del_node.next

del_node.next.pre=del_node.pre

else:

# 如果key不在链表中,才考虑删去尾元素或者更改size

if(self.size==self.capacity):

# 如果满了,要删去尾部节点

self.dic.pop(self.tail.pre.key)

self.tail.pre.pre.next=self.tail

self.tail.pre=self.tail.pre.pre

else:

self.size+=1

self.dic[key] = new_node

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

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

相关文章

摩尔定律已死?GPU会取代CPU的位置吗?

来源:全球人工智能 概要:CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。 京举办的NVIDIA GTC China会议中,无论是AI智能运算,还是服务器数据中心、智能城市&#xff…

mysql 终端模拟_mysql客户端模拟脏读、幻读和可重复读

如果操作一下时报出错误:在数据库中执行 SET GLOBAL BINLOG_FORMAT mixed;执行后可通过SELECT * FROM information_schema.GLOBAL_VARIABLES WHERE VARIABLE_NAME ‘BINLOG_FORMAT’ ;进行查看。通过客户端选择可用数据库:use db_test(模拟数据库)以下…

Nature Human Behavior:大脑对不公平的反应有助预测抑郁症

来源:生物帮、神经科技 概要:过去的研究已经表明,财富分配不均,即经济不平等,可能会促进抑郁症等精神疾病的增加。但是,这背后的机制却不为人知。 2017年10月2日,国际学术权威刊物自然出版集团旗…

mysql创建table w3c_MySQL ALTER命令

MySQL ALTER命令当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。开始本章教程前让我们先创建一张表,表名为:testalter_tbl。 roothost# mysql -u root -p password;Enter password:mysql> use W3CSCHOOL;Datab…

这几家公司有个梦想:开发AI操作系统,让外行也成为人工智能大师

来源:科技行者 概要:未来几年人工智能会如何发展?除了阿尔法狗令人叹为观止的表现,人工智能确实也正在改变整个行业。但有一点我们是需要注意的,有必要让AI从总体上变得更加易于使用。 严格的说,Scot Barto…

mysql耦合_内聚与耦合

简单理解一下内聚和耦合。什么是模块模块就是从逻辑上将系统分解为更细微的部分,分而治之。复杂问题因为复杂性的问题,比较难解决,但是可以将复杂问题拆解为若干简单问题,逐个击破地解决这些简单问题,最后实现解决复杂…

mysql3.51 密码修改_mysql修改密码

刚初始化的数据库要做的步骤1 为root设置了密码2 删除默认用户3 删除默认的test库修改密码的方法1为管理员设置密码(开始没密码)mysqladmin -uroot password 12qwaszx;2 修改密码方法一: mysqladmin管理工具 (推荐使用)mysqladmin -uroot -p12qwaszx password c110123;注意有空…

Google CEO Sundar Pichai :“谷歌最大的威胁就是自身的成功”

作者:Dude 概要:10月9日,低调的皮柴哥接受了英国卫报的访问,在访谈期间,他分享了谷歌在人工智能上发展,也表达了对谷歌近年来发展的隐忧。 10月9日,低调的皮柴哥接受了英国卫报的访问&#xff0…

python自动客服排班_使用或工具的护士排班问题,在某些日子增加不同的轮班时间...

我正在从here修改代码,我希望能够为某一天添加不同长度的轮班(例如,我希望星期五/第4天只有2个轮班)。我的代码总是以错误代码结尾。我相信这是由于我设定的一些限制的内部问题。在我在类似的程序上看到了一些关于StackOverflow的帖子,但是找…

国防科技大学教授:殷建平——计算机科学理论的过去、现在与未来

来源:图灵人工智能殷建平 教授,博士生导师,国防科学技术大学计算机系主任。研究方向有:模式识别与人工智能、网络算法与信息安全。享受国务院政府特殊津贴。2015年被评为“万人计划”国家级教学名师。2009年被评为“全国优秀教师”…

cmd上打开mysql_cmd连接mysql的方法

连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车)创建授权:grant select on 数据库.* to 用户名登录主机 identified by \"密码\"修改密码:my…

《自然》杂志:关于人类未来的工作,有三个最紧迫的问题

来源:36氪 概要:机器学习会淘汰工人吗?零工经济(Gig Economy)会增加对工人的剥削吗?技能的差距能够弥补吗? 机器学习会淘汰工人吗?零工经济(Gig Economy)会增…

java 冒泡排序的三种写法_冒泡排序的三种实现(Java)

冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。设数组的长度为N:(1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。(2)这样对数组的第0个数据到…

有史以来影响世界的颠覆性技术 | 未来的高附加值颠覆性技术产业

来源:DeepTech深科技(ID:mit-tr) 概要:没有工具,人类就是一个脆弱的物种,没有任何人种可以手无寸铁面对自然。技术伴随人类成长,从野蛮走向文明。人类历史就是一部技术史。 人类发展…

redirect java 配置_Java从后台重定向(redirect)到另一个项目的方法

(1)通过ModelAndView跳转RequestMapping("alipayforward")public ModelAndView alipayforward(HttpServletRequest req, HttpServletResponse resp) throwsException {String contNoreq.getParameter("contNo");logger.info("访问/downloadRequestEle…

一文详解脑科学研究与产业发展方向

来源:神经科技、脑计划 概要:大脑是人体最复杂的器官,破译大脑运转密码、揭开生命之谜,是令无数科学家殚精竭虑的艰难课题。脑科学已成为21世纪最前沿的研究领域,尤其与信息科学进行交叉研究已成为脑科学发展的一个重要…

ef生成mysql字段注释_EFcore+MySql 数据迁移的时候,怎么给表结构加注释?

前言:CodeFirst运用的场景比较少,不代表CodeFirst不好,也不能和DbFirst去作比较,本来就是两个东西。吐槽:MySql.Data.EntityFrameworkCore 作为Oracle官方维护的组件,居然对EF很多API不支持或者无效&#x…

10秒一部电影,全球首个5G数据连接完成

作者:李赓 概要:2017年10月17日、也就是上周二,高通在香港高调宣布——其面向移动终端的5G调制解调器芯片组,骁龙X50 5G调制解调器芯片组完成了全球首个5G连接,同时实现了千兆级速率并在28GHz毫米波频段上的数据连接。…

idea 不打开文件提示错误_解决IDEA误删out目录下的文件导致404无法访问的问题

前言有时候IDEA下写Web项目时可能会遇到如下问题:误删out目录下的文件导致开启服务器后无法访问页面的问题新增加一个页面或添加一张图片,在项目编译运行后,未能自动更新到out\artifacts\目录下,从而导致页面无法访问,或者图片未能…

华为生态链的全方位解读

来源: 本翼资本CapitalWings 概要:华为作为目前国内ICT行业的融合性创新龙头企业,其多年经营探索的经营模式和宝贵经验使得其成为传统制造业转型的标杆,而对于新兴企业,能够越过坎坷的探索之路,直接嫁接华…