数据结构(python)实现
数据结构中的基本方法的实现。
python小明
bug虐我千百遍,我待bug如初恋!
展开
-
图的最短路径(弗洛伊德算法)python实现
之前的迪杰斯特拉算法求得是知道起始点,然后得出从起始点到剩下所有顶点的最短路径。时间复杂度为O(n2)O(n^2)O(n2)。那如果要求出每一对顶点之间的最短路径,首先想到的一个方法就是:每次以一个顶点为源点出发,重复着执行迪杰斯特拉算法n次,这样,所求的便是每一对顶点之间的最短路径。总的执行时间为:O(n3)O(n^3)O(n3)。弗洛伊德就提出了另一个算法,虽然该算法的时间复杂度也是O(n3)O(n^3)O(n3),但是比上述的方法简单些。弗洛伊德算法的基本思想:从图的带权矩阵cost出发,假设求原创 2020-11-22 21:51:40 · 2499 阅读 · 0 评论 -
图的最短路径之(迪杰斯特拉算法)python实现
前面我们已经了解到了无环有向图怎样求关键路径的方法,今天我们来看看无向图怎样求最短路径,这在实际应用过程中的作用很大,不如交通路线图,从出发点到终点,走哪条路用时最短,或者花费最少等问题。我们先来看单源最短路径的求法。即给定了起点vvv,求从起点出发,到图中各个顶点的最短路径问题。对于这个问题,迪杰斯特拉(Dijkstra)提出了一个按路径长度递增的次序产生的最短路径的算法。下面介绍迪杰斯特拉算法思想:(1)、假设用带权的邻接矩阵arcs来表示带权有向图,arcs[i][j]表示弧<viv_i原创 2020-11-21 21:15:26 · 7937 阅读 · 3 评论 -
图之查找关键路径(python)实现
与AOV-网对应的是AOE-网(Activity on Edge)即便表示活动的网。AOE网是一个带权的有向无环图,其中,顶点表示事件,弧表示活动持续的时间。通常,AOE网可以用来估算工程的完成时间。由于AOE网中的有些活动是可以并行进行的,所以完成整个工程的最短时间是从开始点到完成点的最长路径长度(这里所说的路径长度是指路径上各活动的持续时间之和,不是路径上弧的数目。)路径长度最长的路径叫做关键路径。求关键路径的算法:(1)输入e条弧(j,k),建立AOE网;(2)从源点v0v_0v0出发,令v原创 2020-11-20 23:46:20 · 6528 阅读 · 2 评论 -
最小生成树之(克鲁斯卡尔算法)和(普里姆算法)python实现
克鲁斯卡尔算法(Kruskal):设有一个有n个顶点的连通网N={V,E},最初先构造一个只有n个顶点,没有边的非连通图T={V, E},图中每个顶点自成一个连通分量。当在E中选到一条具有最小权值的边时,若该边的两个顶点落在不同的连通分量上,则将此边加入到T中;否则将此边舍去,重新选择一条权值最小的边。如此重复下去,直到所有顶点在同一个连通分量上为止。普里姆算法的基本思想:普里姆算法是另一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。从连通网络 N = { V, E }中的某原创 2020-11-19 20:43:14 · 2243 阅读 · 0 评论 -
简述图之拓扑排序(python)实现
要想知道什么是拓扑排序,那首先得有数学功底嘛,所以我们先来说说离散数学中的偏序和全序的概念。偏序: 集合内只有部分元素之间在这个关系下是可以比较的比如:比如复数集中并不是所有的数都可以比较大小,那么“大小”就是复数集的一个偏序关系全序: 集合内任何一对元素在在这个关系下都是相互可比较的比如:有限长度的序列按字典序是全序的~(最常见的是单词在字典中是全序的)当然我们来看看标准定义:偏序的定义:设R是集合A上的一个二元关系,若R满足:Ⅰ 自反性: 对任意x∈A,有xRx;Ⅱ 反对称性(即反对称原创 2020-11-18 23:33:18 · 3110 阅读 · 0 评论 -
简述最优二叉树(赫夫曼树)
什么是哈夫曼树:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。哈夫曼树被用来进行哈夫曼编码,下面来介绍哈夫曼编码:假设需要传送的电文为“ABACCDA”,它只有四种字符,只需要用两个字符的串就可以分辨,假设A,B,C,D的编码分别是00,01,10,11,则该电文的编码便是:“00010010101100”,总长为14位,对方接收时,只需要二位一原创 2020-11-16 19:59:32 · 17757 阅读 · 0 评论 -
浅谈大根堆,小根堆,以及堆排序(python)实现
既然要说堆排序,那么必然要说说什么是大根堆,小根堆了。大根堆: 若根节点存在左右子节点,那么根节点的值大于或等于左右子节点的值。小根堆: 若根节点存在左右子节点,那么根节点的值小于或等于左右子节点的值。通俗来说,那顾名思义,大根堆就是根节点比左右孩子都要大或者等于的二叉树,小根堆就是根节点比左右孩子都要小或者等于的二叉树。那么我们可以总结出关于大根堆和小根堆的结论:(1)、堆是一棵完全二叉树;(2)、小根堆的根节点是堆中最小值,大根堆的根节点是堆中最大值;(3)、堆适合采用顺序存储。堆最重要原创 2020-11-16 17:18:36 · 10959 阅读 · 1 评论 -
哈希表(哈希函数的构造方法、处理冲突的方法,以及哈希索引的弊端)
在之前讨论到的线性结果和线性结构中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在那些结构中查找关键字主要的操作就是进行比较,查找的效率依赖于查找过程中所进行的比较次数。于是理想情况下我们不需要进行比较就能够找出所查的记录,那就必须在记录的存储位置上和啊它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中的一个唯一的存储位置相对应。因而在查找时,只要根据这个对应关系f就能找到给定值K的像f(K),若结构中村子和k相等的记录,则必定在f(K)的存储位置上,由此,不许要进原创 2020-11-14 17:59:41 · 1557 阅读 · 0 评论 -
希尔排序(python)实现
'''排序思想:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序。'''def shell_sort(arr_list): n = len(arr_list) gap = int(n / 2) while gap > 0: for i in range(gap, n): temp = arr_list[i] j = i原创 2020-11-14 15:41:05 · 146 阅读 · 0 评论 -
插入排序(python)实现
'''排序过程:从第二个元素开始与前i-1,i-2,....个元素进行比较,如果该元素大于第i个元素,则将i到改元素之间的向后移动,将改元素插入到改位置。'''def insert_sort(arr_list): for i in range(1, len(arr_list)): key = arr_list[i] #待排序元素 j = i - 1 while j >= 0 and key < arr_list[j]: #从j-原创 2020-11-14 14:39:14 · 116 阅读 · 0 评论 -
红黑树的(python)实现
由之前所说的二叉查找树可以看出,二叉查找树是在动态存储的过程中使得序列变成了有序序列,一旦有序之后,就方便我们进行各种操作。相对于无序数据而言,在我们分析数据和查找数据上都会带来很大的不便,所以我们需要先对数据进行排序,将其变成为有序数据,这样将会对后期我们进行数据处理带来很多方便之处,包括数据分类,查找,插入和删除等操作,这些操作建立在有序表上的话就方便很多。之前所说的二叉排序就是在存储数据的过程中,我们就刻意的让数据进行有序的存储,这样在后来使用过程中就不需要对数据进行排序了,减少了不必要的操作。但原创 2020-11-06 18:18:48 · 946 阅读 · 0 评论 -
二叉排序树(二叉搜索树,二叉查找树)的(python)实现
二叉排序树,又叫做二叉搜索树或者二叉查找树,它具有以下性质:若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值。若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值。左、右子树也分别为二叉搜索树。构建二叉查找树及其操作class BSTNode: """ 定义一个二叉树节点类。 以讨论算法为主,忽略了一些诸如对数据类型进行判断的问题。 """ def __init__(self, data): """原创 2020-11-04 22:41:46 · 715 阅读 · 0 评论 -
堆排序(python)实现
def MAX_Heapify(heap,HeapSize,root):#在堆中做结构调整使得父节点的值大于子节点 left = 2*root + 1 right = left + 1 larger = root if left < HeapSize and heap[larger] < heap[left]: larger = left if right < HeapSize and heap[larger] < heap[原创 2020-11-02 20:41:33 · 155 阅读 · 0 评论 -
快速排序(python)实现
快速排序1. 介绍: 快速排序使用分治法策略,把一个串行(list)分为两个子串行(sub - lists)。 快速排序,快,而且效率高!它是处理大数据最快的排序算法之一了。 快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据, 然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。 2. 一趟快速排序的算法是: 设置两个变量i、j,排序开始的时候:i = 0,j = N - 1; 以第一个数组元素作为原创 2020-11-02 20:27:47 · 446 阅读 · 0 评论 -
归并排序(python)实现
'''*******归并排序****** >>> more important 时间复杂度:O(nlog₂n) 空间复杂度O(n)''' # 分区合并def merge(a, b): c = [] h = j = 0 while j < len(a) and h < len(b): if a[j] < b[h]: c.append(a[j]) j +=原创 2020-11-02 20:19:51 · 178 阅读 · 0 评论 -
选择排序(python)实现
'''选择排序1. 算法步骤 a:首先在未排序序列中找到最小元素,存放到排序序列的起始位置 b:再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。 c:重复第二步,直到所有元素均排序完毕。2. 复杂度 时间复杂度:O(n²) 空间复杂度:O(1)3. 稳定性:不稳定'''def select(arr): for i in range(len(arr) - 1): minIndex = i for j i原创 2020-11-02 20:15:19 · 218 阅读 · 1 评论 -
冒泡排序(python)实现
'''冒泡排序:1. 算法步骤: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的操作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。2. 复杂度 时间复杂度:O(n²) 空间复杂度:O(1)3稳定性:稳定'''def M_P_select(arry): for i in原创 2020-11-02 20:11:37 · 167 阅读 · 0 评论 -
二叉树的左,右视图(python)实现
前面以及说了二叉树的创建以及先序,中序,后序,层次遍历的方法,见本文,下面我们来说说实现二叉树的左,右视图。把至于左右视图是什么,我想小学生都懂,下面直接上案例: a b c # e f # # # g h # # # #如上面的二叉树,左视图应该为a,b,e,g;右视图应该为a,c f,h。那怎样代码实现呢,其实相当简单,只需要在之前的层次遍历的方法上原创 2020-11-02 19:51:09 · 769 阅读 · 0 评论 -
python实现图(基于图的不同存储方式)的深度优先(DFS)和广度(BFS)优先遍历
对于图在计算机内不同的存储方式,图的深度和广度优先遍历算法的写法也不同,但是两种算法的基本思想不变的,本文介绍不同方式存储的图的两种遍历方法的实现。原创 2020-10-27 23:53:58 · 2697 阅读 · 2 评论 -
python实现基本数据结构第四篇(图:字典存储,邻接矩阵存储,邻接表存储)
图是比树更复杂的一种数据结构。图中各个数据元素之间存在着多对多的关系,实际上日常生活中大部分关系都是图的关系,很多关系交错在一起就组成了一个规模很大的图,既然图这么重要,那么现在我们就谈谈如何在计算机中存储图这种数据元素存在多对多关系的数据结构。当然,图分为无向图和有向图,至于基本概念,度娘里有很多,这里就不多赘述了。图的字典形式存储python实现:图中的每个顶点,都是字典中的键,和该顶点有边相连的顶点列表,就是该键的值。class Graph(): def __init__(self):原创 2020-10-26 23:08:08 · 3622 阅读 · 0 评论 -
python实现基本数据结构第三篇(二叉树)
二叉树: 二叉树是一种特殊的树,它的特点是每个结点的至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。由此:二叉树有五种基本形态:(1)空二叉树。(2)仅有根节点的二叉树。(3)左子树不为空,右子树为空的二叉树。(4)右子树不为空,左子树为空的二叉树。(5)左右子树都不为空的二叉树。二叉树有如下重要性质:性质1: 在二叉树的第i层上至多有2的(i-1)次方个结点;性质2: 深度为K的二叉树至多有2k−12^k-12k−1个结点;性质3: 对于任原创 2020-10-25 23:23:24 · 192 阅读 · 0 评论 -
python实现基本数据结构第二篇(顺序栈、链栈,顺序队、链队)
栈(stack):是限定仅在表尾进行插入或删除操作的线性表。表尾存在特殊含义,称为栈顶,表头称为栈底,不含数据元素的空表称为空栈。栈用自己通俗的话讲,其实类似一个圆桶,桶口相当于栈顶,桶底相当于栈底,往桶里装盘子就相当于往栈里压入数据,要取出第一压入栈中的数据元素,就必须从桶口依次取出,这样才能取出第一个放进桶里的盘子,即第一入栈的数据元素,这就是所谓的先进后出原则。顺序栈的python实现:class StackUnderflow(ValueError): #定义空栈访问时,栈下溢出 p原创 2020-10-23 23:55:35 · 1020 阅读 · 2 评论 -
python实现基本数据结构第一篇(线性表:顺序表,单、双链表,单、双循环链表)
数据结构是编程的基础,类似于学习数学,首先要认识数字一样。所以数据结构学的如何,就意味着编程基础是否牢固,下面介绍数据结构中的基本数据结构:线性表(顺序表,链表)讲到数据结构,首先我先了解下什么是数据结构:数据结构:是相互之间存在一种或者多种特定关系的数据元素的集合。数据结构4种基本类型:(1)集合:结构中的中的数据元素之间除了同属于一个集合的关系之外,没有其他关系;(2)线性结构:结构中的数据元素之间存在一对一的关系;(3)树形结构:结构中数据元素之间存在一对多的关系;(4)图状结构(网状结原创 2020-10-23 00:21:38 · 266 阅读 · 0 评论