python数据结构
本专栏主要根据北京大学地球与空间科学学院陈斌老师的mooc所写,部分内容有所扩展,仅供学习之用。
无穷升高的卡农
本硕人工智能方向,之后从事搜推方向的工作。关注CV、RS、大模型。
展开
-
递归 ------ 汉诺塔
汉诺塔 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 我们假设有n个圆盘,三根柱子A,B,C,如果要把三个圆盘从A移动到C,相当于我们把上面的n-1个圆盘...原创 2019-10-12 20:56:09 · 152 阅读 · 0 评论 -
递归 ------ 注意事项(递归次数限制)
注意事项 python中的递归次数是有限制的,默认是1000。 import sys print(sys.getrecursionlimit()) 但是,也是可以修改的: sys.setrecursionlimit(3000) print(sys.getrecursionlimit()) ...原创 2019-10-12 20:22:53 · 1335 阅读 · 0 评论 -
递归 ------ 任意进制转换
任意进制转换 # 任意进制转换 def toStr(num, base): # num为待转换的数字,base为几进制 convertString = "0123456789ABCDEF" if num < base: return convertString[num] else: return toStr(num//bas...原创 2019-10-12 20:13:37 · 395 阅读 · 0 评论 -
链表 ------ 链表实现
无序链表实现 栈和队列都可以使用python的list来进行设计,但是,链表的节点本身是一种结构体数据,里面不仅存放有数据,还有,一个指向下一个节点的指针。但是,数据结构也不是局限于指针语言的,无指针的语言照样可以实现链表。 代码如下: 定义节点类,毕竟python没有结构体 class Node(object): def __init__(self, initdata): s...原创 2019-10-09 18:51:26 · 145 阅读 · 0 评论 -
双端队列 ------- 解决回文词问题
解决回文词问题 什么是回文词,就是正念反念都一样的词,比如: abcdcba, 1221, 1234567654321等等等等。 思路: 建一个双端队列,把整个词依次push到双端队列里。之后,使用while循环,循环终止条件为队列里元素个数小于等于1,每次循环时,从头和尾各pop出一个词,比较是否相同,如果相同,继续,如果不相同,返回False。 代码: def Solution(s): ...原创 2019-10-09 08:48:40 · 325 阅读 · 0 评论 -
双端队列 ------ 双端队列的实现
双端队列的实现 队列只能在一头入,另一头出。双端队列可以在一头出,也可以入,在另一头也一样。 实现: class Deque(object): def __init__(self): self.items = [] def isEmpty(self): return len(self.items) == 0 def si...原创 2019-10-09 08:39:53 · 612 阅读 · 0 评论 -
队列 ------ 解决Josephus(约瑟夫)问题
用队列解决Josephus(约瑟夫)问题 什么是约瑟夫问题:(来源:百度百科) 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止...原创 2019-10-07 17:03:03 · 484 阅读 · 0 评论 -
队列 ------ 队列的实现
队列的实现 我们再生活中见到的排队就是一种队列,先进的先出,后进的后出。 队列的实现同样是基于list创建一个对象 class Queue(object): # 我们把list的尾当作queue的头,list的头当作queue的尾,这样方便我们 # 利用list的现有函数进行操作 def __init__(self): self.items = [] ...原创 2019-10-07 16:40:50 · 149 阅读 · 0 评论 -
栈 ------ 计算后缀表达式的值
计算后缀表达式的值 我们知道,后缀表达式形如:ABC*+,运算符只作用于离他最近的两个操作数。所以,上面的后缀表达式转换为中缀表达式为:A+B*C 所以,我们计算后缀表达式的值时,遇到操作数就把他push到栈里,遇到运算符,就从栈里pop出两个操作数,进行运算。把结果再压入栈,继续运算,知道表达式读取完毕。这样就可以了。 定义栈: class Stack(object): def __ini...原创 2019-10-07 16:12:42 · 338 阅读 · 0 评论 -
栈 ------ 表达式转换
表达式转换 例:A+BC 是中缀表达式,它的后缀表达式为:ABC+ 思路: 遇到字母或者数字,直接输出。遇到运算符,先push到一个栈里,等遇到下一个运算符,和前一个比较一下,前一个优先级高的,就pop出去,把后来的push进去。后一个优先级高的,把他push到栈里。最后,再把栈里元素全部输出。 栈定义函数 class Stack(object): def __init__(self): ...原创 2019-10-07 15:50:32 · 191 阅读 · 0 评论 -
栈 ------ 进行简单和复杂括号匹配
括号匹配 我们在这里做简单的括号匹配,即只含‘()’的括号。我们使用的是栈。 定义栈: class Stack(object): def __init__(self): self.item = [] def isEmpty(self): return self.item == [] def push(self, data): ...原创 2019-10-07 10:01:02 · 197 阅读 · 2 评论 -
栈 ------ 进行进制转换
使用栈进行进制转换 我们知道,进制转换的方法就是除2取余。但是,每一次的余数排列的时候应该是从右往左。即先得到的余数排在最右侧,最后得到的余数排在最左侧。 这和栈先入后出的原理不谋而合,所以用栈解决是很方便的。 栈的python实现 ...原创 2019-10-07 09:42:23 · 166 阅读 · 0 评论