![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
数据结构和算法相关内容
CY3761
这个作者很懒,什么都没留下…
展开
-
数据结构和算法 | 根据前序遍历与中序遍历确定树
# CY3761 | 2021-12-22 16:51"""思考题如何通过一棵无重复节点的树的先序遍历(先) 中序遍历(中)先: 0->1->3->7->8->4->9->2->5->6中: 7->3->8->1->9->4->0->5->2->6去构造这棵树的结构?0(根)先: 1->3->7->8->4->9 | 2->5->6中原创 2021-12-22 18:25:23 · 348 阅读 · 0 评论 -
数据结构与算法 | 树的深度优先遍历
# CY3761 | 2021-12-22 11:15"""ABC(A)DE(B) FG(C)H(D)树的深度优先遍历先序遍历根节点->左子树->右子树从根开始是否具有子树?是遍历左节点.. 接着循环是否具有子树,无往上一层,是否具有右子树?是遍历右节点.. 接着循环假设如果E有子节点,则继续下层遍历左再往上遍历右A->B->D->H->E->C->F->G中序遍历左子树->右子树->根节点原创 2021-12-22 16:45:41 · 1068 阅读 · 0 评论 -
数据结构与算法 | 树的广度优先遍历(完全二叉树)
# CY3761 | 2021-12-21 17:18"""02.树的广度优先遍历完全二叉树的 add"""def getId(o): if o is None: return None return hex(id(o))[7:]# 节点类class Node: def __init__(self, item): self.item = item # 节点值 self.lPoi = None #原创 2021-12-21 23:27:44 · 489 阅读 · 0 评论 -
数据结构与算法 | 二分查询
# CY3761 | 2021-12-21 15:05"""在一组数据中找某一个特定项的算法过程通常用来判断某个特定项是否在一组数据中,最终返回True或False常用的查找算法: 顺序查找,二分查找,树表查找,哈希查找等顺序查找 遍历二分查找 折半查找将表中间位置记录的关键字与查找关键字比较,如果相等则比较成功;否则利用中间位置的记录缩小区间,继续查找缩小后的区间.重复上面的步骤直到查找成功,或者子表不存在,则查找失败.树表查找 基于树的结构实现哈希查找 基于哈希表算法"""原创 2021-12-21 16:34:28 · 539 阅读 · 0 评论 -
数据结构与算法 | 桶排序
# CY3761 | 2021-12-20 020 17:28"""桶排序根据数组的最大值与最小值申请一些桶将数组的元素放入桶中,并保证桶里是有序的合并每个桶""""""[3,9,23,4,11,33,14,16]桶容量 : 假设是 5最大值 - 最小值 | 33 - 3 | 30桶数量 : ((33 - 3) // 5) + 1 = 7申请 7 个桶桶的范围 3~7 8~12 13~17 18~21 22~26 27~31 32~3603~07 : 03, 04 |原创 2021-12-20 18:28:09 · 54 阅读 · 0 评论 -
数据结构与算法 | 快速排序
# CY3761 | 2021-12-17 19:32"""快速排序分而治之设定一个基准值pivot将数组重新排列,所有比pivot小的放在其前面,比pivot大的放后面,这操作称为分区(partition)操作对两边的数组重复前两个步骤""""""[44,12,59,36,62,43,94,07,35,52,85]设定一个基准值pivot 4412 < 44 | 左 |59 > 44 | 右 |36 < 44 | 左 |62 > 44 |原创 2021-12-17 21:12:29 · 272 阅读 · 0 评论 -
数据结构与算法 | 希尔排序
# CY3761 | 2021-12-17 16:16# 希尔排序 (插入排序的优化版)# 一般用于嵌入式程序"""设定一个增量gap,将数组按照gap分组对每一组进行插入排序缩小增量gap,重复前两个步骤,直到gap缩小到1,那么最后一次排序就是插入排序""""""[44,12,59,36,62,43,94,7,35,52,85]设置一个增量 5 , 进行分组第1个元素 44 然后走5步 43一组 然后走5步 85一组 [44,43,85] 交互位置 [43,44,85]第原创 2021-12-17 19:29:47 · 525 阅读 · 0 评论 -
数据结构与算法 | 双向链表
# CY3761 | 2021-12-15 20:58import typesimport copy# 链表的节点可以通过 头尾进行找下一个或者上一个# A => prev item next# B => prev item next# C => prev item next# A.next = B# B.prev = A B.next = C# C.prev = Bclass Node: def __init__(self, _item, **kwar原创 2021-12-16 20:38:33 · 199 阅读 · 0 评论 -
数据结构与算法 | 排序 | 插入排序
# CY3761 | 2021-12-16 18:31# 插入排序"""[9, 3, 1, 2, 7, 5]分 有序区 无序区[9] [3, 1, 2, 7, 5]第1趟[9] [3,1,2,7,5] | [3,9] [1,2,7,5] | (无序区第一个值插入到有序区, 并进行排序)第2趟[3,9] [1,2,7,5] | [1,3,9] [2,7,5] | (无序区第一个值插入到有序区, 并进行排序)第3趟[1,3,9] [2,7,5] | [1,2,3,9] [7,5]原创 2021-12-16 19:21:36 · 55 阅读 · 0 评论 -
数据结构与算法 | 排序 | 选择排序
# CY3761 | 2021-12-16 16:57# 02.选择排序"""初始状态: 有序区为空, 无序区为[0,…,n]每次找到无序区里的最小元素,添加到有序区的最后重复前面步骤,直到排序完成""""""排序数据 (无序区) [9, 3, 1, 2, 4, 7]数据 (有序区)(无序区)[] [9, 3, 1, 2, 4, 7]第1趟数据 [][9, 3, 1, 2, 4, 7] 找到最小的元素 与 放入有序区最后数据 (有序区)(无序区)[1][3, 9, 2, 4,原创 2021-12-16 18:28:55 · 72 阅读 · 0 评论 -
数据结构与算法 | 排序 | 排序算法稳定性&冒泡排序
# CY3761 | 2021-12-16 11:23# 排序算法稳定性&冒泡排序"""排序算法的稳定性稳定的排序算法会让原本有相等键值的记录维持相对次序不稳定的排序算法可能会改变相等键值的记录的相对次序6个格子0 1 2 3 4 5 | 索引3 1 2 1 4 5 | 值升序排序 (稳定, 值相等时使用索引进行排序)1 3 2 0 4 5 | 原索引1 1 2 3 4 5 | 排序后结果升序排序 (不稳定, 值相等时不一定使用索引进行排序)3 1 2 0 4 5原创 2021-12-16 16:22:30 · 173 阅读 · 0 评论 -
数据结构与算法 | 06.单向循环链表
# CY3761 | 2021-12-08 16:12import copyimport types# 单向循环链表"""单向循环链表与普通链表区别尾节点的 next 不再是None, 而是指向链表的头节点其链表形成一个环, 这种数据结构称为单向循环链表一般可能用于一群人玩游戏, 当触发某种机制时停止, 这个人出局, 如此类推"""class Node: def __init__(self, _item, _next=None): self._item =原创 2021-12-15 19:22:34 · 207 阅读 · 0 评论 -
数据结构与算法 | 双端队列
# CY3761 | 2021-12-14 17:22# 双端队列-可以对两端进行操作 (用得比较少)"""Deque() 创建一个空的队列isEmpty() 判断一个队列是否为空length() 返回队列的元素个数pushR(item) 添加一个元素到队尾pushL(item) 添加一个元素到队头popL() 弹出队头popR() 弹出队尾head() 获取队头"""# 顺序表实现class Deque: def __init__(self):原创 2021-12-15 15:19:31 · 267 阅读 · 0 评论 -
数据结构与算法 | 从限制个数队列引入循环队列
在现实生活中,我们的队列常常会有长度限制,比如队列中已经有n个元素了,那么就提示队列已满你能否实现一个限制长度的队列呢?如果实现一个限制长度的队列, 用顺序结构该如何去实现才能做到所有操作的时间复杂度都是O(1)呢?链表实现# 链表有节点类class Node: def __init__(self, _item, _next=None): self._item = _item # 数据域 self._next = _next # 指针域原创 2021-12-14 17:15:41 · 74 阅读 · 0 评论 -
数据结构与算法 | 队列实现
队列-顺序表# CY3761 | 2021-12-13 17:18"""队列队尾入队,队首出队先进先出""""""Queue() 创建一个空的队列is_empty() 判断一个队列是否为空length() 返回队列的元素个数push() 添加一个元素到队尾pop() 弹出队头peek() 获取队头"""# 队列-顺序表class Queue: def __init__(self): self._items = [] def i原创 2021-12-14 12:53:45 · 191 阅读 · 0 评论 -
数据结构与算法 | 有效的括号
# CY3761 | 2021-12-13 15:59class Stack: def __init__(self): self._items = [] def push(self, *args): # 进行优化 可以连续添加多个值 for _ in args: self._items.append(_) # 列表的最后元素作为栈顶 def pop(self): if self.isE原创 2021-12-13 17:14:31 · 58 阅读 · 0 评论 -
数据结构与算法 | 栈实现 (使用py实现)
用顺序表结构实现# CY3761 | 2021-12-13 11:32"""栈要实现的操作Stack() 创建一个新的空栈push(item) 添加一个元素item到栈顶pop() 弹出栈顶元素top() 返回栈顶元素isEmpty() 判断栈是否为空size() 返回栈的元素个数"""# 用顺序表结构实现class Stack: def __init__(self): self._items = [] def push(self,原创 2021-12-13 15:53:03 · 211 阅读 · 0 评论 -
数据结构和算法-12.单向链路-重学(自写)-单向链表-剩下的-03
# CY3761 | 2021-12-06 15:45# 节点类import copyclass Node: def __init__(self, _item, _next=None): self._item = _item # 数据域 self._next = _next # 指针域 def next(self, *args): if len(args) == 0: return self._原创 2021-12-07 13:43:45 · 65 阅读 · 0 评论 -
数据结构和算法-11.单向链路-重学(自写)-单向链表-后插入、指定插入02
# CY3761 | 2021-12-06 15:45# 节点类import copyclass Node: def __init__(self, _item, _next=None): self._item = _item # 数据域 self._next = _next # 指针域 def next(self, *args): if len(args) == 0: return self._原创 2021-12-06 22:47:40 · 56 阅读 · 0 评论 -
数据结构和算法-10.单向链路-重学(自写)-单向链表-前插入01
# CY3761 | 2021-12-06 15:45# 节点类class Node: def __init__(self, _item, _next=None): self._item = _item # 数据域 self._next = _next # 指针域 def next(self, *args): if len(args) == 0: return self._next原创 2021-12-06 18:20:16 · 46 阅读 · 0 评论 -
数据结构和算法-09.单向链路-重学(自写)-01
# CY3761 | 2021-12-06 10:27# 实现单向链表功能, 先看视频约 2.5小时课时 记录相关要点# 连续的顺序空间, 如果存满了就需要扩容, 申请一片更大的内存空间并把原有数据复制到新内存空间, 但这样会造成空间浪费 (更大的内存空间并没有完全都写满)# 是否有一种数据结构可以新增一个元素就创建一格空间,而不改变原有数据的存储, 删除就删除一个空间, 就缩容一个格子# 因为分开存储, 内存地址是不连续的, 数据都是独立的 (如何使数据关联? 联想下分离式顺序表结构[容量,元素原创 2021-12-06 13:50:35 · 272 阅读 · 0 评论 -
数据结构和算法-08.链表单向链表
最近身体不舒服,停更了一些天,只能慢慢补上了,这个感觉难点,很绕,说实话我还没搞懂…# CY3761 | 2021-12-01 10:36# 节点类import typesclass Node: def __init__(self, data, next=None): # 在生成节点时需要传入值 self.data = data # 数据域 self.next = next # 指针域 链表的下一个节点(指针域)# 单向链表类class S原创 2021-12-04 16:29:23 · 575 阅读 · 0 评论 -
数据结构和算法-07.链表概述
# CY3761 | 2021-12-01 09:37## 有没有一种数据结构, 在扩容缩容或者新增删除的时候只处理一个, 不需要改变原有数据区# 一组数据 100, 200, 300, 400# 如果是顺序表 容量可能是 8 元素个数就只有 4 可能出现浪费情况# 希望是存一个数据, 就申请扩容一个, 删除一个, 就申请缩容一个, 不影响其他内存地址# 100(0x12345678) -> 200(0x23455678 地址不连续) -> 300(0x34565678)# 一原创 2021-12-01 10:00:37 · 576 阅读 · 0 评论 -
数据结构和算法-06.顺序表
# CY3761 | 2021-11-30 11:17# 1, 2, 3, 4, 5 这样一组数据如何以某种关系存储在计算机中, 使得只要知道其中一个元素的地址, 就可以得到其他元素的地址?# 位(bit) 最小的存储单位,每一位存储一个1位的二进制码# 字节(byte) 由8个bit组成的存储单元 | 8个二进制码# int = 4个字节 = 32bit | 32个二进制码# 如果是 1 (32b) 32位2进制# 0000 0000# 0000 0000# 0000 0000#原创 2021-11-30 19:09:57 · 260 阅读 · 0 评论 -
数据结构和算法-05.数据结构引入
# CY3761 | 2021-11-30 10:04# 数据结构引入## 根据英雄名推荐英雄的推荐出装# 存储 英雄名以及对应的出装 (列表存储)a = [ # ['英雄名', ['出装1', '出装2', '出装3']], ['亚索', ['电刀', '攻速鞋', '无尽']],]# 通过英雄名 获得其出装列表 | 时间复杂度 O(n)b = '亚索'for _ in a: if _[0] == b: print(_[1]) # 对原创 2021-11-30 11:03:42 · 172 阅读 · 0 评论 -
数据结构和算法-04.列表与字典的时间复杂度
# CY3761 | 2021-11-29 18:00# 列表import copya = list(range(10))print(a[3]) # 通过索引取值 | O(1) | 顺序表相关a[7] = 'G' # 通过索引赋值 | O(1) | 顺序表相关a.append(11) # 通过 append 向后追加一个元素 | O(1) | 对其他元素不影响a.pop() # 删除最后一个元素 | O(1) | 对其他元素不影响a.pop(1) # 删除指定下标的一个原创 2021-11-29 19:43:20 · 209 阅读 · 0 评论 -
数据结构和算法03.timeit模块
# CY3761 | 2021-11-29 16:47a = [] # 一个空列表print('-' * 80)a.append(1) # 添加一个元素a.insert(0, 2) # 从索引0位置添加元素 添加后 0索引的值是2 原来的值会向后移动print(a)# PY有一个类似模块 timeit.Timer# 测试某段代码的运行时间# Timer(stmt, setup, timer, globals) 一个Timer对象"""stmt: statement,要测原创 2021-11-29 17:57:38 · 63 阅读 · 0 评论 -
数据结构和算法-02.时间复杂度
# CY3761 | 2021-11-29 14:50# 时间复杂度# 优化上一课的算法# 代码执行多久import timeimport typesdef handler(algo): print('-' * 80) stime = time.time() if isinstance(algo, types.FunctionType): c = algo() etime = time.time() p原创 2021-11-29 16:22:15 · 320 阅读 · 0 评论 -
数据结构和算法-01.算法引入
算法引入# CY3761 | 2021-11-29 11:38# 选择合适的数据结构, 设计一个巧妙的算法, 可以让程序的执行时间快上不少, 消耗的资源也会得到降低# 如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?# 解题4步# 分析需求 设计算法 代码实现 验证结果# 分析需求# 求出符合 a+b+c=1000 且 a^2+b^2=c^2 (a,b,c 为自然数) 所有a、b、c可能的组合# 设计算法# 尝试 a原创 2021-11-29 12:32:46 · 269 阅读 · 0 评论