算法与数据结构
AivenZ
stay hungry stay foolish
展开
-
约瑟夫问题
约瑟夫问题,也叫约瑟夫环。问题描述: n(编号从0到n-1)个人围成一个圈,从0号人开始数(从1开始数),数到第m个人,这个人淘汰。又从下一个人开始,从1开始数,一直循环淘汰到只剩一人,这个人胜出。求这个人的编号。解法一:模拟这个问题很多人第一眼看到就觉得不是很简单吗,直接模拟就行啊。的确是,用一些列表类型的数据结构模拟一下就很容易做出来了。做法也因人而异。不过这方法只适用于人数和步数很小的...原创 2020-04-04 02:37:12 · 2455 阅读 · 0 评论 -
煎饼排序
煎饼排序指的是将大小不同的一摞煎饼(一个煎饼放在另一个煎饼上堆起来),按大小排序的数学问题,其中的操作是,只能用煎饼铲子从任意位置插入,铲起上方全部煎饼并翻面。学术化一点,就是只能把插入位置之前的数组翻转的排序方法–“前序翻转排序”。这个问题我也是偶然看到知乎上讨论比尔盖茨的话题中了解到的。说他找到了更好的方法。一般来说煎饼排序最多要翻 2*n 次,但是他找到了最多翻(5n+5)/3 次的方法。...原创 2019-12-22 16:24:29 · 1693 阅读 · 0 评论 -
kruskal算法(最小生成树) python实现
kruskal的思路很直观,边按权值从小到大排序,然后从小到大选不会构成回路的边,构成生成树。(选两点不在同一个连通分量里面的边)构建并查集,用并查集判断是否构成回路(是否在同一个分量里面)(两个连通分量如果根结点相同,两点连接就会构成回路)python代码:def find(x, pres): """ 查找x的最上级(首级) :param x: 要查找的数 ...原创 2019-06-25 20:03:08 · 4673 阅读 · 7 评论 -
floyd算法(多源最短路径) python实现
Floyd算法用来找每个点两两之间的最短距离(多源最短路径),是典型的动态规划原理很简单:一个点 i 到另一个点 j 的最短路径无非有两种:直接到达( i --> j )通过走其他点(k1, k2 … kn),一个或多个点到达( i --> k1–>k2–> j )所以找最短路就直接 比较 1 和 2 哪条路径更短数据结构:邻接矩阵(n*n) graph, ...原创 2019-06-26 20:28:13 · 12437 阅读 · 10 评论 -
kruskal算法(最小生成树) Java实现
kruskal(克鲁斯卡尔)的思路很简单,自行google。Java的kruskal实现起来有点麻烦,主要是边排序那里,我自己写了个MyEdge类继承comparable,然后再用Collections.sort()。。。用习惯了python,觉得java好啰嗦,实现一个想法要好久好绕。package Graph;import java.util.ArrayList;import jav...原创 2019-06-27 15:56:37 · 2641 阅读 · 0 评论 -
floyd算法(多源最短路径) Java实现
这里记录一下java实现的floyd算法模板。package Graph;public class Floyd { //无穷大 public static int inf = Integer.MAX_VALUE; public static void main(String[] args) { // 图数据 Data [u, v, cost] ...原创 2019-06-27 17:33:01 · 641 阅读 · 0 评论 -
拓扑排序 python实现
拓扑排序是指在有向无环图中,把所有结点按照一定的排序排成一列,使得左边的点都指向右边的点。一般有两种方法做拓扑排序1.Kahn算法用一个一维数组存每个结点的入度。用一个数据结构(随意都可以,数组,栈,列表等等)存储所有入度为0的结点。每次从入度为0的结点出发,记录路径,删除该结点,把该结点指向的点的入度减1,再找入度为0的结点,存进数据结构。再循环操作,直到找不到入度为0的结点就停止,如果还...原创 2019-07-05 11:18:55 · 1731 阅读 · 0 评论 -
强连通分量
概念:强连通:有向图中两个结点如果能两两互相到达,就称这两个点强连通。强连通图:有向图中所有结点都能两两到达,就称强连通图。强连通分量:非强连通的有向图的极大强连通子图,称为强连通分量(SCC即Strongly Connected Componenet)。一个图中可以有多个。强连通分量是一个环或者一个点。求强连通分量一般用 Korasaju算法 和 Tarjan算法。这里我就只记录...原创 2019-08-21 17:16:26 · 2368 阅读 · 0 评论 -
欧拉路径-欧拉回路
概念:欧拉路径:经过图中所有的边一次(一笔画)是欧拉路径欧拉回路:经过图中所有的边一次,并回到起点,是欧拉回路。欧拉图:存在欧拉回路的图就是欧拉图欧拉回路是欧拉路径,欧拉路径不一定是欧拉回路。半欧拉图:只有欧拉路径(非回路)的图是半欧拉图。判断一个无向图和有向图是否有欧拉路径和欧拉回路很简单,无向图看每个点的度数,有向图看每个点的出入度。欧拉路径欧拉回路无向图...原创 2019-08-23 11:40:01 · 1148 阅读 · 0 评论 -
网络流-最大流
最大流问题:源点source(S点)开始源源不断的通过中间的一些管道流到槽点sink(T点),求最后T点最大有多少流量。常用的算法是增广路算法,通过不同的找增广路的方法会有不一样的复杂度,也分别为不同叫法,一般用dfs找增广路的算法叫 FF(Ford-Fulkerson)算法,用bfs的叫EK(Edmonds-Karp)算法。这里我主要记录一下EK算法。一些概念增广路:这里网络流的增广路网...原创 2019-09-05 20:18:49 · 315 阅读 · 0 评论 -
并查集_Java实现(模板)
关于并查集的概念和效率,这里不详述,网上一大堆,这里主要记录一下并查集的 python代码实现三步走:1.初始化pre和rangks数组,pre为每个元素的父结点(上一级),ranks为每个元素作为根节点时的树的秩(树的深度),一开始设置pre的每个值为每个元素自己,设置ranks每个值为0.2.find() 查询该元素的首级,顺便做路径压缩3.join() 合并两个集合,按秩合并,秩小的...原创 2019-04-09 16:29:55 · 640 阅读 · 0 评论 -
并查集_python实现(模板)
关于并查集的概念和效率,这里不详述,网上一大堆,这里主要记录一下并查集的 python代码实现三步走:1.初始化pre和rangks数组,pre为每个元素的父结点(上一级),ranks为每个元素作为根节点是的树的秩(树的深度),一开始设置pre的每个值为每个元素自己,设置ranks每个值为0.2.find() 查询该元素的首级,顺便做路径压缩3.join() 合并两个集合,按秩合并,秩小的...原创 2019-04-09 14:53:08 · 2601 阅读 · 0 评论 -
算术表达式求值-中缀表达式(栈实现)-Java
中缀表达式是我们最常见的算术表达式,在人类看来比较直观,而用机器实现有点复杂。这里的方法利用两个栈,一个用来放数字numStack,一个用来放符号opStack。具体步骤如下: 从左到右扫描表达式 1.扫描到数值,把数值压入数字栈numStack。2.扫描到数学符号 2.1扫描到加减号‘+’,‘-’,符号栈里的符号一个个出栈,同时出一个...原创 2018-09-09 01:00:16 · 5871 阅读 · 5 评论 -
prim算法(最小生成树) python实现
prim算法和dijkstra算法基本思路一模一样,都是贪婪。都是从costs边数组里面找最短边,把这个最短边的结点加入t(已经确定好最短边的点)中。然后再遍历这个结点的邻边,更新costs。但是prim和dijkstra的区别在哪里呢?dijkstra的costs,costs的每个值存的是开始点到该点的路径权值总和而prim的costs,costs的每个值存的是该点到该点父结点的边权,只...原创 2018-11-23 16:20:14 · 3555 阅读 · 2 评论 -
dijkstra算法(单源最短路径) python实现
代码1:用最原始的方式实现dijkstra,就是每次从costs里面找最短路径的点,再遍历这个点的边,更新最短路径。由于每次都要从costs里面找最短路径,时间复杂读为O(n^2)。# dijjkstra算法(原生最短路径,还未优化)def dij(start, graph): n = len(graph) # 初始化各项数据,把costs[start]初始化为0,其他为无穷...原创 2018-11-23 13:16:06 · 10139 阅读 · 13 评论 -
六度空间
六度空间一个数学领域的猜想,名为Six Degrees of Separation,中文翻译包括以下几种: 六度分割理论或小世界理论等。 理论指出:你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个中间人你就能够认识任何一个陌生人。也叫小世界理论。(百度)这个理论以前就听说过了,现在学了图论之后,感觉也就那样,好像没那么神奇。在现在每个人,至少大概能直接联系到的人能有100人...原创 2018-12-03 01:36:04 · 1728 阅读 · 0 评论 -
深搜(dfs)-广搜(bfs)python实现
基于邻接表的深搜和广搜图:(忽略边权,这里只看边)import sysfrom queue import Queuesys.setrecursionlimit(1000000)# 深搜def dfs(start, graph, vis): print(start, end=' ') vis[start] = True for sub in graph[s...原创 2018-12-14 19:57:35 · 2639 阅读 · 0 评论 -
基于二维矩阵的深搜(dfs)和广搜(bfs)python实现
该二维矩阵不是邻接矩阵,每个结点只和上下左右4个方向的结点有连接。def bfs(start, matrix): """广搜""" n = len(matrix) queue = [] queue.append(start) vis = [[False for _ in range(n)] for _ in range(n)] vis[start[...原创 2018-12-14 20:30:51 · 2145 阅读 · 0 评论 -
dijkstra算法(单源最短路径) Java实现
用例图:用ArrayList实现的邻接表图,每个结点有个动态列表记录这个结点的邻边数据Edge包括(指向的下一个结点,边权)基于此图写了一个dijk算法。dijk的主要流程:花销表int[] costs:记录从源点到各花销的最短路径。访问表boolean[] vis:表示哪些结点可以走。1.costs[源点] = 0,其他点的cost设置为Integer.MAX_VALUE2.vis...原创 2019-03-30 00:33:49 · 1919 阅读 · 0 评论 -
动态规划_01背包问题(Java实现)(Java模板)
动态规划有很多问题百度百科:"动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。举例:线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等;树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等;背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等...原创 2019-04-01 21:37:38 · 3482 阅读 · 0 评论 -
动态规划_01背包问题(python实现)(python模板)
0-1背包问题:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。这里记录下python的模板def dp(weight, count, weights, costs): """ 动态规划模板,时间复杂度O(weight * count), 空间复杂度O(weight) :param weight: 背包最大能装的重量...原创 2019-04-01 23:14:44 · 4650 阅读 · 0 评论 -
基于二维矩阵的深搜dfs和广搜bfs Java实现
以前是用教科书学的图的遍历,书里的搜索算法是基于邻接矩阵和邻接表而写的,在遇到二维图的时候,其实可以直接基于二维数组写搜索算法。在网上也看到一些别人写的代码,也是在二维数组上通过查找上下左右四个方向来遍历,所以我也用Java实现了基于二维数组的广度和深度遍历。//此类是用来描述一个基于二维数组的图package Graph;import java.util.LinkedList;p...原创 2018-08-31 14:30:48 · 1813 阅读 · 4 评论