【高级数据结构其一·并查集】 经典应用:连通子图,最小生成树Kruskal,最近公共祖先。方法一:邻接表+枚举二进制状态+DFS连通新判断。方法二:邻接矩阵+DFS全排列枚举+并查集。方法三:DFS全排列枚举+DFS连通性判断。用于快速处理不相交集合的查询和合并问题。路径压缩后,为O(1),效率大大提升。因为复杂度为O(n),效率太慢。笔者在此就不再详细写此方法。
深度优先搜索(DFS) 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。DFS的另一种结束条件,就是找到了目标出口,也就是找到了题目的答案。到发现节点v的那条边的起始节点。
dijkstra算法(优先队列PriorityQueue) 作用:dijkstra算法能够解决边权非负的加权有向图的单起点最短路径问题。也就是说,规定一个起点,就能够得到这个加权有向图中其他点距该起点的最短距离。数据结构(建图):建图:graph=[[float('inf') for i in range(n)]for j in range(n)] #二维图for i in range(m): a,b,c=map(int,input().split()) graph[a][b]=c graph[b][a]=c1,数.
宽度优先搜索(广度优先搜索,BFS) 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。DFS的另一种结束条件,就是找到了目标出口,也就是找到了题目的答案。到发现节点v的那条边的起始节点。
[KMP] 这不就是相当于把s2往前推的效果吗?这也是为什么求next信息时,规定任何字符串,0位置的next信息为-1。想象一下,当配置串跳着跳着,某一刻你的next信息值小于0了,你就知道不能再往前跳了,也就代表着较长串在这个区间内已经是不可能配出我了,较长串你该重新换个开头了。
关于python的一些知识 sort的效率比sorted高,sort是快速排序,时间复杂度是O(n*ln(n)),与归并排序和快速排序时间复杂度一样。d=copy.deepcopy(a) 深拷贝,创造一个与a元素相等的列表b,地址不一样。c=a.copy() 浅拷贝,可改变列表中的元素时同时改变,但添加元素时互不影响。元组的访问和处理速度比列表快,不可变,但是内有列表可对列表进行改变。b=a 幅值,传对象的引用,地址一样,完全相等。a+=b(原地执行)的效率比a=a+b要高。
【动态规划DP】 动态规划和递归十分类似,算是和DFS一样是递归的另一种解题实现方式动态规划是编程解题的一种重要手段。1951年美国数学家R.Bellman等人,根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。与此同时,他提出了解决这类问题的“最优化原理”,从而创建了解决最优化问题的一种新方法:动态规划。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。
【字符串和日期】 (m+1)/5+y+y/4-y/100+y/400+1)%7 ,在公式中d表示日期中的日数,m表示月份数,y表示年数。我们如果直接对字符串,或者列表进行修改会导致其长度和下标不断变化,故十分麻烦。普通闰年:公历年份不是100的倍数的,且是4的倍数,为闰年。世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年。我们可以直接用split函数和join函数。
【二分查找】 适用条件: 存在一个有序的数列;能够把题目建模为在有序数列上查找一个合适的数值。实数二分相比较整数二分就没这么多限制。套路题(最小值最大化,最大值最小化)在单调递增序列中找x或者x的后继。在单调递增序列中找x或者x的前驱。二分+check(思维)二分+check(贪心)
【前缀和】 我们就可以先将s进行排序,也就是2,这时可以保证最大值最小;但因为s0和sn不能移动,所以,这时我们把s0和sn再放到起点和终点,不过并不是简单的放两个点,而是将上图的1和3区域铺开,),重复路段取间隔点会使相邻点差值最小来看,就是一半跟着s0,sn取翻过来,一半保持不变,这个时候要注意s0→min和max→sn是从大到小排序,min→max是从小到大排序。铺开后,因为min→s0和sn→max与两头的s0→min和max→sn重复了,如果s0和sn不是最小值和最大值,那该怎么做呢?
【赛后Python解】第五届“传智杯”全国大学生计算机大赛(初赛B组) 解析:贪心题,先从小到大排序,然后利用枚举从右(i=0)开始变化,从左(j=0)开始变化,每一步的变化操作都做完后取极值,然后再与之前的比较,得出最小的极值。读者可能会不明白为什么从右来一遍,还要从左再来一遍,因为从右开始时,j的取值为x,也就是m。解析:数学题,找规律,像分段函数,然后利用等差数列求和求解就行了。用python写超时了。