
Python 数据结构与算法
用 Python 实现常见的数据结构与算法
阿慕路泽
To life, like today is the end.
展开
-
11、树状数组(binary_indexed_tree)
1、简介所谓的Binary Indexed Tree,首先需要明确它其实并不是一棵树。Binary Indexed Tree事实上是将根据数字的二进制表示来对数组中的元素进行逻辑上的分层存储。树状数组的核心思想:每个元素是原数组中一个或多个连续元素的和在进行连续求和操作 a[1]+...a[n] 时,只需求树状数组中某几个元素的和即可,时间复杂度为 O(logn)在进行修改某个元素 a...原创 2019-12-31 11:18:45 · 238 阅读 · 0 评论 -
10、线段树(segment_tree)
1、简介线段树算法是一种快速查询一段区间内的信息的算法,由于其实现简单,所以广泛应用于程序设计竞赛中。线段树是一棵完美二叉树,即所有的叶子节点的深度均相同, 并且所有的非叶子节点都有两个子节点。每个节点维护一个区间,这个区间为父节点二分后的子区间,根节点维护整个区间,叶子节点维护单个元素,当元素个数为n时,对区间的操作都可以在O(log n)的时间内完成,因为此时树的深度为log2 n + 1...原创 2019-12-31 11:17:24 · 242 阅读 · 0 评论 -
9、并查集(disjoint_set)
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。常常在使用中以森林来表示。并查集有三种基本操作:获得根节点判断两节点是否连通将两不连通的节点相连(相当于将两节点各自的集合合并)用UnionFind类来表示一个并查集,在构造函数中,初始化一个数组parent,parent[i]表示的含义为:索引为i的节点,它的直接父节点为parent[i]。初始化时各个节点都不相连...原创 2019-12-31 11:16:31 · 237 阅读 · 0 评论 -
8、哈希表(hashtable)
HashTable 是一种非常常见且用途十分广泛的数据结构,使用 HashTable 可以大大的提高数据的检索速度,是一种非常优秀的结构。1.Hash 算法散列(哈希)是一种对资料的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(称为散列表)。一个典型的 Hash 算法是将整数除以一个常量并且取...原创 2019-12-31 11:15:37 · 292 阅读 · 0 评论 -
7、AVL 树
1、AVL 树AVL树的名字来源于它的发明作者 G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。定义:它或者是一颗空树,或者具有以下性质的二叉查找树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。...原创 2019-12-27 16:05:04 · 303 阅读 · 0 评论 -
6、二叉搜索树(Binary search tree)
1、二叉树二叉树是指每个节点最多有两个子节点的树结构。注意事项:树的根节点是树的第 1 层。二叉树的性质:二叉树的第 i 层上的节点数最多为 2*(i- 1) (i > 1)深度为 k 的二叉树至多有 2*k - 1 个节点包含 n 个节点的二叉树的高度至少为 log2(n+1)在任意一颗二叉树中,若终端节点的个数为 n0, 度为 2 的节点数为 n2,则 n0 = n...原创 2019-12-26 13:53:54 · 471 阅读 · 0 评论 -
5、链表(linked list)
1、单链表(Linked List)list是最常用的数据结构,但是list在中间增减元素的时候效率会很低,这时候linked list会更适合。链表的特点:非线性,非连续存储的数据存储在节点("Node")中,节点包含:数据 + 下一个节点的指针操作的时间复杂度:增删改查的时间复杂度都是 O(n),单在链表头的操作时间复杂度是O(1)带虚拟头结点的单链表的 Python 实...原创 2019-12-26 13:52:50 · 1250 阅读 · 0 评论 -
4、循环队列(circle queue)
1、简介普通队列的出队操作的时间复杂度为O(n)(因为要整体移动元素),而循环队列就可以完美解决这个问题,使得出队与入队操作均为O(1)的时间复杂度。两个关键索引:head:队首的索引tail:队尾的索引出队维护 head,入队维护 tail。两个关键状态:空队列:head == tail,因为 head 是闭区间,tail 是开区间,即[head, tail),当 head...原创 2019-12-24 17:45:55 · 789 阅读 · 0 评论 -
3、队列(queue)
1、简介特点:队列也是一种线性数据结构队列只能从一端(队尾)添加元素,从另一端(队首)取出元素队列是一种先进先出(First In First Out)的数据结构队列的操作:enqueue:入队dequeue:出队get_front:查看队首元素的值get_size:获取队列长度is_empty:判断队列是否为空2、实现(1)使用 Python list 实现 qu...原创 2019-12-24 14:51:32 · 208 阅读 · 0 评论 -
2、栈(stack)
1、简介栈(stack)和动态数组一样,是一种线性数据结果。特点:只能从一端添加元素,也只能从这一端取出元素。这一端称为栈顶。是一种先进后出(LIFO:Last In First Out)的数据结构。栈的操作:push:向栈中添加一个元素pop:删除栈顶元素peak:获取栈顶元素的值size:获取当前栈的大小is_empty:判断栈是否为空2、实现(1)使用 Pytho...原创 2019-12-24 14:37:36 · 228 阅读 · 0 评论 -
1、动态数组(array)
1、数组(array vs list)array: 定长,操作有限,但是节省内存,可以用import array直接导入list: 会预先分配内存,操作丰富,但是耗费内存。list.append: 如果之前没有分配够内存,会重新开辟新区域,然后复制之前的数据,复杂度退化list.insert: 会移动被插入区域后所有元素,O(n)list.pop: pop不同位置需要的复杂度不同pop...原创 2019-12-24 14:27:59 · 609 阅读 · 0 评论