【顶配快速排序】CUTOFF配合三点中值法的三路划分 Robert Sedgewick 观察到,当序列较短时,快速排序引入的额外代价比较明显,此时插入排序反而更快。极端情况下,所有数字都相同,会发生N/2次不必要的交换,因为划分是平衡的,故总体性能还是O(NlgN)。一种抽样的方法是检查,头,尾巴,中间的元素,然后选出其中的中位数作为pivot,即可保证最短序列至少有一个元素。
【Queue新技法】用双数组实现一个队列 C++ 说明:记入队的列表为F(Front),出队的队列为R(Rear),那完整的队列。是O(N),可只有几次,但O(1)出队操作却有N个,即均摊到每次出队操作上只有。如上图所示,左边是原来的队列,右边是翻转后的队列。,也叫循环缓冲区,如图灰色部分就是队列的内容。
【二分查找】求解单调方程的解 C++实现 查找是否存在某一个值。可以先找中间,每次放弃一半,效率。注意,为了一般化单调递增函数或者数列,我们把。,单调递增,现在给一个正整数。最常见的,一个严格单调递增。
2021-07-18Bert # coding=utf-8from __future__ import absolute_import, division, print_functionimport copyimport jsonimport mathimport siximport torchimport torch.nn as nnfrom torch.nn import CrossEntropyLossimport torch.nn.functional as Ffrom torch.nn.utils.r
多行且每行不确定个数的数据读取 讨厌的换行和getline() 实例31 2 5 6 81 2258 3 65 14读到换行符停止void init() { _read(N); getchar(); int t; _for(i, 0, N) { char ch = ' '; while (ch!='') { cin >> t; ch = getchar(); out(t); } }}字符串流void init() { _read(N); getchar();//必须去掉,否则会读到首
修改数组 第十届蓝桥杯省赛C++A/研究生组 AcWing原题链接Ac code#include<vector>#include<cstring>#include<iostream>#include<string>#include<cmath>#include<algorithm>using namespace std;#define _for(i,from,to) for(int i=(from);i<(to);++i)//[from,to)#defi
2021-1 索引优先队列 c++ 原理背景:常见的,用例已经有了N个元素,且有多个平行数组。只需要把索引加入队列。如果有现成的结构体数组,只要一个关于索引的优先队列即可。注意到,只调整索引(一个整型数)要比交换结构体高效很多。索引优先队列,可理解为能够快速访问最小元素的数组(甚至是任意一部分子集的最小元素,只把这一部分加入队列就好)。API函数名功能void insert(int k,KEY key)插入元素key,并和索引k关联void change(int k,KEY key)将索引为k的值
2021-1 加权有向图 最短路径 理论准备 定义最短路径:在一幅加权有向图中,从顶点s到顶点v的最短路径指的是所有s到t中路径权重的最小者。最短路径树:包含起点s到所有可达顶点的最短路径,s为根节点,树中的每条路径都是一条最短路径。最短路径的性质路径是定向的。 最短的路径必须遵循其边缘的方向。 权重不一定是距离。 几何直觉可能会有所帮助,但是边缘权重权重可能代表时间或成本。并非所有顶点都需要可达。 如果t不能从s到达,则根本没有路径,因此从s到t没有最短的路径。 负权重会带来并发症。假设边缘权重为正(或为零)。 最短路径通常很简单。
2021-1 从文件构建图 加权有向边 加权有向图的构建 邻接表 c++ 图构造对比加权无向图无权有向图无权无向图加权有向图[本文]API1 有向边的类2 加权有向图测试图实现1 有向边类#pragma once#include<iostream>using namespace std;#define out(x) cout<<x<<" "#define hh printf_s("")string intToStr(int n);string doubleToStr(double d);
2021-1 并查集 c++ union_find APIUF(int n) 构造函数,初始化n个空间bool connected(int v, int w)判断是否连通int find(int p) 找到p所在集合的根void Union(int v,int w) 合并两个集合,大写首字母为了区别关键字union代码//UF.h#pragma once#include<vector>#include<iostream>using namespace std;class UF{pub
2021-1 贪心算法 最小生成树 Kruskal算法 c++实现 基本原理基础定义点这里了解 最小生成树理论准备假定树有V个顶点,按照边的权重由小到大处理,将边加入到最小生成树中,且加入的边不会和已经加入的边构成环,直到树中含有V-1条边为止。黑色边为树,灰色为无用边,所有灰色和所有白色节点构成一个切分,右侧边按权重排序。几个关键按照权重排序边,用一条优先队列。合并森林中的两棵树并识别环,用并查集。用一条队列来保存树的各个边。实现不失重点的,先看如何写好 Kruskal算法 。并查集,优先队列等工具放在文末。#pragma once#inc
2021-1 基于堆的优先队列 为Prim版本定制 c++ 优先队列APIinsert(key k)插入节点KeydelMin() 返回最小节点的ID,并从队头删除find(int id) 在队列中查找指定ID的索引,找不到返回-1reduceTo(Key e) 将对象的关键值减小,后调整队列实现c++#pragma once#include<queue>#include<iostream>#include<map>using namespace std;class minEdge{public:
2021-1 最小生成树 Prim算法的延时版本 c++ 基本原理关于横切边和切分定理,点这里 最小生成树理论准备树中的边是黑色加粗,红色边为横切边,加粗红色为最短横切边,也是将要加入最小生成树的边。解决三个问题最短横切边怎么找?用一条优先队列MinPQ来根据权重比较所有边如何保存切分?通过索引的布尔数组marked,标记已经加入树的节点(白色集合),自己的补集为灰色集合,两者构成一个切分。如何保存树?法一,通过一个队列mst保存最小生成树所有边法二,用一个父亲数组记录边,例如,edgeTo[v]记录着将v连入树中的Edge对象
2021-1最小生成树理论准备 MST定义图的生成树:含有全部顶点的无环连通子图加权图的最小生成树MST: 权值最小的生成树一些约定只考虑连通图。至于非联通的图,将所有联通分量的最小生成树构成最小生成森林,换句话说不连通的没有最小生成树。边的权重不一定表示距离,短边也可能有高权重。边的权重可能是0或者负数。如果要求全为正数,将最小生成树定义为连接所有顶点且总权重最小的子图就够了。所有边的权重不同,权重不同树就一棵,反之不然。切分定理树的两个性质:连接任意两个节点都会产生一个新的环,加边成环。删去任意一条边都会
2021-1 从文件构建图 加权边API 加权无向图API c++ 有权边API用法提示:得到一条边edge的两个顶点,这样用:int v=edge.either(); int w=edge.other(v);c++实现//Edge.h#pragma once#include<iostream>#include<fstream>#include<string>using namespace std;#define out(data) cout<<data<<" "#define hh p