数据结构
bebr
这个作者很懒,什么都没留下…
展开
-
学习笔记-循环单链表(Python实现)
循环单链表是单链表的一种变形,其最后一个结点的next域不再是None,而是指向表的第一个结点。在循环列表对象中记录表位结点,可以实现O(1)时间的表头/表尾插入和O(1)时间的表头删除。由于循环链表中的结点连成一个圈,哪个结点是表头或表尾,主要是概念问题,从表的形态上无法区分。以下实现了一个简单的循环单链表类,其中包含了几个典型的操作:class Node: def __init__(s...原创 2018-06-06 17:34:22 · 4454 阅读 · 1 评论 -
二分法检索(Python)
二分法检索是一种重要的检索技术,其基本思想是逐步缩小需要考虑的数据范围,从而快速逼近需要找的数据。def Binsearch(lst,key): #lst是一个顺序表 low, high = 0, len(lst)-1 while low <= high: mid = (high-low) // 2 if key == lst[mid]: ...原创 2018-06-14 20:13:49 · 589 阅读 · 0 评论 -
常用散列函数和冲突消解机制(数据结构)
散列函数(哈希函数)是一种大集合到小集合的映射。这种映射肯定会出现不同的关键码被映射到同一个位置的情况,称为冲突。关于冲突有一个重要的度量值:负载因子。 负载因子越大,出现冲突的可能性就越大。扩大散列表的存储空间,就可以降低负载因子;但是负载因子过小,就会造成散列表中的空间浪费。用散列技术实现字典,需解决两个大问题:散列函数的设计,冲突消...原创 2018-06-15 11:38:41 · 2750 阅读 · 1 评论 -
求两个列表的交集(Python)
如果s的当前元素小于t的当前元素,则应该进一步考虑s的下一个元素;他中当前元素较小的也是同样的道理;只有两个两个列表的当前元素相等时,将其加入到交集中。假设s、t中的元素个数分别为m和n,主循环的每次迭代总能处理掉两个集合中的至少一个元素,所以此算法的时间复杂度是O(m+n)。def findIntersection(s,t): s.sort() t.sort() ...原创 2018-06-15 17:33:56 · 2045 阅读 · 0 评论 -
学习笔记-用二叉排序树实现字典类(Python实现)
二叉排序树,又称二叉查找树,或二叉搜索树。二叉排序树或者为空,或者具有以下性质:如果其左子树不空,那么其左子树上所有结点的值均小于其根结点的值。如果其右子树不空,那么其右子树上所有结点的值均大于其根结点的值。非空的左子树或右子树也是二叉排序树。如果对二叉排序树做中序遍历,将得到一个递增序列。下图是数据集[36,65,18,7,60,89,43,57,96,52,74]所生成的两棵二叉排序树。可见,...原创 2018-06-17 21:47:41 · 2029 阅读 · 0 评论 -
分步图解平衡二叉树的插入过程(Python实现)
一、基本概念:平衡二叉树:是一种特殊的二叉排序树,它或者为空树,或者每个结点的左右子树都是平衡二叉树,也就是每个结点的左右子树的高度之差只能是-1,0,1三种情况。平衡二叉树又称AVL树,是由苏联的Georgy Adelson-Velsky和E.M.Landis发明的,并以他们的名字命名。与之类似的还有红黑树、B树等。平衡二叉树的平衡状况由平衡因子(Balance Factor,BF)...原创 2018-06-19 08:32:13 · 11933 阅读 · 8 评论 -
学习笔记-简单的排序算法(Python实现)
1、直接插入排序时间复杂度:O(n^2)空间复杂度:O(1)稳定性:稳定插入排序就是将一个数据插入到已经排好序的序列中。如图所示,插入元素是2,则用2依次与左边的元素比较,只要左边的元素大于2,就将左边的元素右移一位,直到2大于左边元素为止。def insert_sort(lst): for i in range(1, len(lst)): ...原创 2018-06-19 11:17:04 · 423 阅读 · 0 评论 -
学习笔记-单链表(Python)
顺序表可以在O(1)的时间内定位元素,但是插入或者删除需要O(n)的时间,因为其需要移动大量的元素块。链表的实现不需要连续的存储区。链表的每个结点含有表元素和指向后继元素的指针。在链表表首插入和删除元素的复杂度都是O(1),在其他位置插入和删除元素的复杂度都是O(n)。下面定义一个链表的结点类:class LNode: def __init__(self, elem, pnext = No...原创 2018-06-21 17:33:27 · 610 阅读 · 1 评论 -
数据结构知识点汇总
1、用链表表示线性表的优点是(便于插入和删除操作)2、单链表中,增加头结点的目的是(方便运算的实现)3、栈和队列的共同特点是(只允许在端点处插入和删除元素)4、栈通常采用的两种存储结构是(线性存储结构和链表存储结构)5、队列具有(先进先出)的特征,栈具有(后进先出)的特征。6、链表(插入和删除不需要移动元素,但是无法随机访问任一元素)7、循环链表的主要优点是(从表中任一结点...原创 2018-07-18 15:44:21 · 131409 阅读 · 31 评论 -
数据结构目录
1、 对于列表和链表的认识。链表的插入、删除;点击链接, 链表的逆序点击链接,链表中是否存在环点击链接。2、 循环单链表的认识。插入、删除操作。点击打开链接3、 双链表的认识,插入、删除操作。点击打开链接4、 栈的认识,栈的入栈、出栈操作。点击打开链接5、 队列的认识,入队、出队操作。Python自带的队列。点击打开链接6、 二叉树的先序、中序、后序;已知先序、中序求后序;已知后序、中...原创 2018-07-04 21:37:02 · 3074 阅读 · 1 评论 -
学习笔记-图、最小生成树、最短路径、AOV/AOE的基本算法(Python实现)
一、采用深度优先搜索来遍历整个图得到DFS序列的步骤:首先访问顶点v,并将其标记为已访问检查v的邻接顶点,从中选一个尚未访问的顶点,从它出发继续进行深度优先搜索。将顶点v剩余的邻接顶点入栈。重复以上操作,直到顶点v的多有邻接顶点都被访问。如果图中还存在未访问的顶点,则选出一个未访问顶点,重复以上操作,直到所有的顶点都已被访问。具体实现在代码的最后部分,前面部分只是栈和图的类实现。class Sta...原创 2018-06-13 09:26:13 · 2734 阅读 · 2 评论 -
学习笔记-数据结构-图的基础知识及邻接矩阵和邻接表的实现(Python)
一、基本概念图是一个二元组G=(V,E)。V是非空有穷的顶点集合。E是图G中边的集合。有向图:图中的每条边都有方向(即带有箭头)。无向图:图中的每条边都没有方向。有向边:用尖括号来表示为<a,b>。a是始点,b是终点。也被称为弧,a是弧尾,b是弧头。无向边:用圆括号表示为(a,b)。完全图:任意两个顶点之间都有边的图(有向图或无向图)。 n个顶点的无向完全图有n*...原创 2018-06-11 11:16:12 · 11882 阅读 · 5 评论 -
学习笔记-双链表(Python实现)
单链表只有一个方向的链接,即使增加了尾结点的引用,也只能支持O(1)时间的表首元素的插入和删除以及尾端元素的插入。如果希望两端插入和删除都变得高效,需要增加另一方向的链接,这就得到了双向链接表,简称双链表。这样做也会付出代价,每个节点都需要增加一个链接域,增加的空间开销与结点数成正比,是O(n)。但是,如果每个表结点里的数据规模比较大,新增加的开销可能就显得不太重要了。 从双链表的任...原创 2018-06-06 22:07:39 · 1072 阅读 · 0 评论 -
学习笔记-栈(Python实现)
栈中的元素都是后进先出(Last In First Out, LIFO).用列表可以实现一个栈类。class StackUnderflow(ValueError): """ 这个是 ValueError的子类,可以抛出自定义的异常 """ passclass SStack(): def __init__(self): self...原创 2018-06-07 11:14:25 · 2929 阅读 · 0 评论 -
学习笔记-栈的简单应用(Python)
用栈来实现简单的括号匹配问题。主要包含圆括号、方括号和花括号。 当前闭括号应该与前面最近的尚未配对的开括号进行匹配,下一个闭括号应该与前面次近的括号进行匹配。这恰恰符合后进先出的的原则。如果一个开括号已经匹配,则将其删除,为随后的匹配做准备。class StackUnderflow(ValueError): pass class SStack(): ...原创 2018-06-07 16:37:36 · 672 阅读 · 0 评论 -
学习笔记-队列(Python实现)
队列中的元素都是先进先出(First In First Out, FIFO) 用列表来实现队列存在着一定的困难。首先根据队列的定义,出队应该在表首进行,但是一个元素出队后,需要将后面的元素一次前移一位,这是一个O(n)时间的操作。Python中list对象的pop(0)就是这样。 另一种可能是在队首元素出队后,剩余的元素不前移,但要记住队头所在的新的位置。但是这样会让前面空出来...原创 2018-06-07 21:27:22 · 1205 阅读 · 0 评论 -
二叉树的先序、中序、后序遍历序列
二叉树的遍历主要有三种:(1)先(根)序遍历(根左右)(2)中(根)序遍历(左根右)(3)后(根)序遍历(左右根)举个例子:先(根)序遍历(根左右):A B D H E I C F J K G中(根)序遍历(左根右) : D H B E I A J F K C G后(根)序遍历(左右根) : H D I E B J K F G C A 以后(根)序...原创 2018-06-08 10:41:57 · 466358 阅读 · 27 评论 -
二叉树基础知识
父节点相同的两个结点互为兄弟结点。没有子结点的结点称为叶结点,树中其余结点称为分支结点(也就是度不为0的结点)。一个结点的子结点的个数称为该结点的度。树中结点的最大层数称为树的高度。二叉树的性质:(1)非空二叉树的第i层至多有个结点。(从第1层开始算起)(2)高度为h的二叉树至多有个结点。(3)任何非空二叉树,如果其叶结点的个数为,度数为2的结点个数为,那么 证明:设:二叉树中总的结点的个数为n,...原创 2018-06-08 16:08:39 · 4272 阅读 · 0 评论 -
学习笔记-优先队列(Python实现)
优先队列是一种重要的缓存结构。优先队列总是会弹出当前元素中优先级最高的。当插入元素时,将其插入到满足当前优先级顺序的位置。 当用列表来实现优先队列时,可以考虑利用元素在列表中的先后顺序来表示优先级关系。为了在O(1)时间内弹出优先级最高的元素,所以应该将优先级最高的元素放在列表的表尾。在以下的实现中,值较小的元素具有更高的优先级。class ListPriQueueValueError(Value...原创 2018-06-08 19:12:34 · 1489 阅读 · 0 评论 -
学习笔记-用堆实现优先队列(Python)
堆是一棵完全二叉树,这棵二叉树需要满足堆序:任何分支结点(即除去叶结点所剩余的结点)的值都大于等于(或小于等于)其左右子结点的值。一般用列表来表示堆(Python中的列表下标从0开始),i结点父结点位置为(i-1)/2,i结点的左右子结点位置为2*i+1和2*i+2。如果堆序是小元素优先,则构造出来的称为‘小顶堆’(小元素在上)。如果堆序是大元素优先,则构造出来的称为‘大顶堆’(大元素在上...原创 2018-06-09 21:26:02 · 3314 阅读 · 0 评论 -
学习笔记-图解堆排序(Python实现)
堆排序思想:堆顶(小顶堆)的元素是整个堆中最小的元素,将堆顶元素与最后一个元素交换,然后用一次‘向下筛选’将新的堆顶元素插入到堆中正确的位置:即比较堆顶元素与其两个左右子结点的大小,如果堆顶元素最小,则将其保留在堆顶位置,停止;如果左子结点或右子结点最小,则交换堆顶元素与左子结点或右子结点的值,然后再沿着当前路径不断地比较下去,直至最初的堆顶元素在某一次比较中是最小值或者到达叶结点位置。此外,如果...原创 2018-06-10 10:47:58 · 8210 阅读 · 3 评论 -
学习笔记-二叉树-先序、中序、后序、层次遍历的实现(Python)
二叉树类的的Python实现及其函数:包括统计结点个数,用递归实现的先序遍历,非递归实现的先序遍历,以及非递归实现的后序遍历。class StackUnderflow(ValueError): pass class SStack(): def __init__(self): self.elems = [] d...原创 2018-06-10 19:08:33 · 573 阅读 · 1 评论 -
计算时间复杂度
一、概念时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)比如:一般总运算次数表达式类似于这样:a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+fa != 0时,时间复杂度就是O(2^n);a=0,b<>0 =>O(n^3);a,b=0,c<>0 =>O(n^2)依此类推eg:(1) for(i...转载 2018-12-25 14:51:33 · 1983 阅读 · 0 评论