python数据结构算法
夹毛局的程序员
这个作者很懒,什么都没留下…
展开
-
20.python实现图的最短路径-弗洛伊德算法
弗洛伊德算法弗洛伊德算法(Floyd-Warshall Algorithm),跟克鲁斯卡尔算法一样是为了解决给定加权图中某一个顶点到其他顶点间的最短距离,可以处理有向图或负权的最短路径问题,同时也被用于在计算有向图的传递闭关。该算法已创始人之一,1978年图领奖获得者,斯坦福大学计算机教授罗伯特·弗洛伊德。适用范围:无负权回路即可,边权正负都可以,运行一次算法即可得到任意两点之间的最短路径。优缺点Floyd算法适用于APSP(AllPairsShortestPaths),是一种动态规划算法,稠密图效原创 2020-09-01 15:14:45 · 1315 阅读 · 0 评论 -
19.python实现图的最短路径-迪杰斯特拉算法
迪杰斯特拉算法迪杰斯特拉算法(Dijkstra)是经典的最短路径算法,用于计算一个节点到其他节点的最短路径。他的主要特点以起始点为中心向外层层扩散(广度优先搜索思想BFS),直到扩展到终点为止。迪杰斯特拉算法过程设置出发顶点为v,顶点集合V(v1,v2,v3…vn),v到V中其他顶点的距离构成一个集合Dis,Dis(d1,d2,d3…dn),记录着v到途中其他各个顶点的具体,v到v自身的距离为0,v到v1的距离为di从Dis中选择最小的di移除Dis集合,移除V集合中对应顶点的vi,此时v到vi的原创 2020-09-01 15:11:55 · 505 阅读 · 0 评论 -
18.python实现最小生成树-克鲁斯卡尔算法
克鲁斯卡尔算法克鲁斯卡尔算法(kruskal)跟普里姆算法一样,目的都是求无向图的最小生成树。普里姆算法核心在于一个顶点接一个顶点的找出最短路径,克鲁斯卡算法在于将每一条边进行升序排序,然后通过边进行筛选从而组成最小生成树。实现步骤核心思想在于按权值从小到大排序选择n-1条边,并保证选择边不会构成回路。用到核心的数据结构并查集来判断是否构成回路。将所有的边按权值大小升序排列创建一个数组selectEdges存在选择出来的边循环遍历已经排好序的边,如果该边不构成回路,则添加到selectEdge原创 2020-09-01 15:08:50 · 938 阅读 · 0 评论 -
17.python实现最小生成树-普里姆算法
最小生成树一个有 n 个结点的带权无向图,在满足所有顶点都连接的前提下使得所有的边的权总和最小,即为最小生成树(Minimum Spanning Tree MST)。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。N个顶点,一定有N-1条边包含所有顶点所有顶点都可以直接或间接连接到另外的顶点普里姆算法普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。对于给定的连通网,起始状态全原创 2020-09-01 15:04:52 · 3653 阅读 · 3 评论 -
16.python实现贪心思想
贪心算法贪心算法(又称贪婪算法),核心思想在求解问题的时候,总是选择当前情况的最优解。贪心算法不是所有问题都能得到整体最优解,核心在于贪心算法的策略选择,选择的贪心策略需要具备无后效性,即某个状态以前的过程不能影响以后的状态至于当前状态有关。贪心算法总是选择当前情况下的最优选择,而不是从整体最优考虑。贪心算法是做的局部最优选择,最终的结果可能在整体环境下不是最优解,但非常接近最优解。贪心算法也会因为策略不同得到不同的结果。应用场景集合覆盖问题假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地原创 2020-09-01 14:59:51 · 213 阅读 · 0 评论 -
15.python实现动态规划01背包问题
动态规划动态规划 Dynamic Programming,核心思想就是将大问题划分成小问题进行解决,从而一步一步的获得最优解的处理算法动态规划跟分治算法思想类似,但动态规划算法会依赖到上一次计算的结果,每次求解是建立在上一次子阶段的结果基础之上进一步处理,而分治算法分解出来问题往往是独立的动态规划一般可以通过填表的方式进行逐步推进得到最优解0/1背包问题01背包问题是经典的利用动态规划算法求解的一个经典案例有n个物品,他们有各自的重量(w)和价值§,有一个给定容量capacity容量的背包,原创 2020-09-01 14:53:42 · 884 阅读 · 0 评论 -
14.python实现图的深度优先和广度优先算法
图图是一种数据结构,其中节点可以具有零个或者多个相邻的元素,两个节点之间的连接成为边。节点也可以成为顶点。邻接表: 邻接表一般采用数组+链表的形式,数组表示各个顶点,链表中的元素表示该顶点与链表中的元素相连,与链表本身的指针没有关系。如上图 数组0 对应的链表1->3->4 表示0这个顶点与1 3 4这个顶点连接 数组1 表示1这个顶点与 0 2 4顶点相连以此类推邻接矩阵和邻接表的区别 邻接矩阵会为每个顶点都分配N个边的空间,其实很多表都不存在,存在了空间的损失,邻接表值关心存在边,因原创 2020-08-31 15:55:31 · 987 阅读 · 1 评论 -
13.python实现赫夫曼树和赫夫曼编码
赫夫曼树路径和路径长度:表示树从根节点开始到达节点经过的次数,若一颗树根节点为1层,那么第K层的树的路径的长度为K-1权: 赋予每一个节点上面特定的权重值带权路径:带权路径等于节点的权与路径长度的乘积,为带权路径 = 权 * 路径长度树的带权路径长度:为所有叶子节点的带权路径之和记做WPL(weight path length)赫夫曼树huffman-tree或哈夫曼树,又称最优二叉树,如果一颗二叉树的带权路径之和最小,及权值越高的越靠近根节点的树为最优二叉树。核心思想将一个序列从小到大原创 2020-08-31 15:43:11 · 301 阅读 · 0 评论 -
13.python实现线索化二叉树
线索二叉树二叉树的叶子节点会有一些空的指针,如果有n个节点则会有n+1个空指针域,将这些空指针域利用起来存在该二叉树为某一种遍历次序下的前驱节点和后继节点的二叉树成为线索二叉树。根据线索二叉树性质不同分为前序线索二叉树,中序线索二叉树,后续线索二叉树。一个节点的前一个节点为前驱节点,一个节点的后一个节点为后继节点核心思想当线索化二叉树的时候left和right就分为两种情况left指向左子树或者指向前驱节点right指向右子树或者后继节点实现线索化二叉树的需要对之前Node节点实体进行原创 2020-08-31 15:39:00 · 619 阅读 · 0 评论 -
12.python实现顺序存储二叉树
顺序存储二叉树是指用一个数组存储的二叉树,一般用于完全二叉树,物理上用数组存储逻辑上是一个树结构。第n个元素的左节点索引2n+1第n个元素的右节点索引2n+2第n个元素的父节点为(n-1)/2n为元素在数组中的索引class Node(object): def __init__(self, data): self.data = dataclass ArrayBinaryTree(object): """ 顺序存储二叉树是指用一个数组存储的二叉树,一原创 2020-08-31 15:37:04 · 1477 阅读 · 0 评论 -
11.python实现AVL平衡二叉树
class Node(object): def __init__(self, data): self.data = data self.parent = None self.left = None self.right = None def __str__(self): return str(self.data) def add(self, node): if self.data &g原创 2020-08-31 15:21:17 · 253 阅读 · 1 评论 -
10.python实现哈希表
哈希表通过最简单的取模运算作为哈希算法class HashNode(object): def __init__(self, id, data): self.id = id self.data = data self.next = None def __str__(self): return '(%d,%s)' % (self.id, str(self.data))class HashLinkedList(object原创 2020-08-31 11:21:14 · 331 阅读 · 0 评论 -
9.python的几种二分查找实现
基础的二分查找from typing import Listdef binary_search(arr: List, target: int, left, right) -> int: """ 二分查找递归实现 :param arr: 原数组 :param target: 查询目标元素 :param left: 左边界 :param right: 右边界 :return: """ while left != right:原创 2020-08-31 11:18:53 · 102 阅读 · 0 评论 -
8.python实现基数排序和堆排序
基数排序from typing import Listdef radix_sort(arr: List) -> List: """ 基础排序 核心思想: 一共有0-9为数字的桶,一共10个,一共循环数组中最大数的位数次(如最大数是1000则是4次个十百千位分别循环), 每一次循环依次从数中取出个、十、百、千、万...位数上的数值放到对应的桶中,如果该位上没有数字补零, 然后依次从0-9桶中取出组成一个新的临时数组作为下一次循环的输入, 一直到循环原创 2020-08-28 18:00:00 · 119 阅读 · 0 评论 -
7.python实现快速排序和归并排序
快速排序from typing import Listdef quick_sort(arr: List, left, right) -> List: """ 快速排序是对冒泡排序的改进,核心思想是找到一个中值点pivot,然后将小于等于pivot的放在pivot的左边,大于pivot的放在右边,一直递归到无法拆分pivot点。 :param arr: :return: """ pivot = (left + right) // 2 piv原创 2020-08-28 17:59:03 · 212 阅读 · 0 评论 -
6.python实现插入排序和希尔排序
插入排序"""插入排序核心思想 将数组分成一个有序数组和一个无序数组 每次从无序数组中提一个元素出来 插入到 有序元素的合适位置"""from typing import Listdef insert_sort(arr: List) -> List: """ 插入排序 :param arr: :return: """ target = [] l = len(arr) for i in range(l): i原创 2020-08-28 17:56:04 · 101 阅读 · 0 评论 -
5.python实现冒泡排序和选择排序
冒泡排序from typing import List"""核心思想是循环length-1次,每次循序找出最大或者最小的一个数,每次比较相邻的两个数,如果大或者小就交换位置,每一次循环可以比较当次最大的一个数。例如 3, 10, -1, 20,8- 第一次循环 1. 指针下移指向 3 3和10比较 不交换 3 10 -1 20 8 2. 指针下移指向 10 10>-1 交换 3 -1 10 20 8 3. 指针下移指向 10 10<20 不交换 3 -1 10 20原创 2020-08-28 17:54:28 · 187 阅读 · 0 评论 -
4.python回溯思想相关问题
迷宫回溯问题# 迷宫回溯问题""" * 约定迷宫的出口是row,column 即右下角的那个点 * 约定数字1为墙,2为走过的路,3为死路,0表示没有走过"""class Maze(object): def __init__(self, x, y): self.x = x self.y = y # 初始化迷宫 self.maze = [[0 for i in range(y)] for _ in range(x)]原创 2020-08-28 17:52:41 · 102 阅读 · 0 评论 -
3.python实现数据结构-栈
基本栈结构class Stack(object): def __init__(self, max_size): self.max_size = max_size self.data = [] def size(self): return len(self.data) def is_full(self): return self.size() >= self.max_size def push(sel原创 2020-08-25 17:54:50 · 118 阅读 · 0 评论 -
2.python实现数据结构-队列
基于Python数组简单队列实现class Node(object): def __init__(self, data): self.data = data self.next = None def __str__(self) -> str: return '(data=%d)' % self.dataclass SimpleQueue(object): def __init__(self, max_size):原创 2020-08-25 17:52:05 · 151 阅读 · 0 评论 -
1.python实现数据结构-稀疏数组
def get_sparse_arr(arr: 'sparse_arr') -> 'sparse_arr': """ 原数组转成稀疏数组 :param arr: :return: """ if len(arr) == 0: return row = len(arr) col = len(arr[0]) value_count = 0 for a in arr: for v in a:原创 2020-08-25 17:45:25 · 396 阅读 · 0 评论