download:协程原理从入门到精通 每个后端开发都需要掌握的高性能开发技术
协程知识在很多课程中都有提到,但都是浅尝即止,均不深入。本课程作为市面上首门协程专题课程,将从基础讲起,与应用原理联动起来,深入协程原理更易于理解,结合丰富的课程案例,并使用Python语言进行落地实践。但一法通则万法通,不管你是Java、Go还是PHP开发,都可以通过本门课程掌握协程原理。对于初中级开发而言,是一门非常适合起手学习高性能开发的课程。
适合人群 希望掌握进程、线程、协程底层原理的同学 想突破业务瓶颈,提高项目并发能力的工程师 面试一问就懵,想系统梳理下协程知识的同学 技术储备要求 具备Python语法基础 有后端项目经验
import java.io.OutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.SortedSet; import java.util.Set; import java.util.NavigableSet; import java.io.IOException; import java.io.InputStreamReader; import java.util.TreeSet; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.io.BufferedReader; import java.util.Comparator; import java.util.Collections; import java.io.InputStream;
/**
Built using CHelper plug-inActual solution is at the top */ public class Main { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; InputReader in = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); TaskH solver = new TaskH(); solver.solve(1, in, out); out.close(); }
static class TaskH { public void solve(int testNumber, InputReader in, PrintWriter out) { int n = in.nextInt(); int len = in.nextInt(); int[] x = new int[n]; int[] y = new int[n]; double[] s = new double[n]; for (int i = 0; i < n; ++i) { x[i] = in.nextInt(); y[i] = in.nextInt(); s[i] = in.nextDouble(); } List<TaskH.Segment> segments = new ArrayList<>(); int pos = 0; for (int i = 0; i < n; ++i) { if (x[i] > pos) { segments.add(new TaskH.Segment(pos, x[i], 0.0)); } segments.add(new TaskH.Segment(x[i], y[i], s[i])); pos = y[i]; } if (pos < len) { segments.add(new TaskH.Segment(pos, len, 0.0)); } out.println(solveOne(segments)); }
private double solveOne(List<TaskH.Segment> segments) {
int n = segments.size();
for (int i = 0; i < n; ++i) {
TaskH.Segment s = segments.get(i);
s.ptr = i;
s.curEnergy = 0.0;
s.maxEnergy = (s.right - s.left) / s.s;
s.minEnergy = -(s.right - s.left) / (s.s + 2);
}
List<TaskH.Segment> segmentsByS = new ArrayList<>(segments);
Collections.sort(segmentsByS, new Comparator<TaskH.Segment>() {
public int compare(TaskH.Segment o1, TaskH.Segment o2) {
int z = Double测试数据pare(o2.s, o1.s);
if (z == 0) {
z = Integer测试数据pare(o2.left, o1.left);
}
return z;
}
});
TreeSet<TaskH.Segment> available = new TreeSet<>(new Comparator<TaskH.Segment>() {
public int compare(TaskH.Segment o1, TaskH.Segment o2) {
return o1.ptr - o2.ptr;
}
});
available.addAll(segments);
for (TaskH.Segment s : segmentsByS) {
if (s.s == 0.0) break;
s.alive = false;
available.remove(s);
NavigableSet<TaskH.Segment> after = available.tailSet(s, false);
double capacity = s.maxEnergy - s.curEnergy;
double spent = 0.0;
while (!after.isEmpty()) {
TaskH.Segment t = after.first();
if (t.alive) {
double t1 = t.curEnergy - t.minEnergy;
double t2 = capacity - spent;
double transfer = Math.min(t1, t2);
spent += transfer;
t.curEnergy -= transfer;
if (t1 <= t2) {
available.remove(t);
} else {
break;
}
}
}
s.curEnergy += spent;
}
double res = 0.0;
for (TaskH.Segment s : segments) {
double v = (s.right - s.left - s.curEnergy * s.s) / (s.right - s.left + s.curEnergy);
res += (s.right - s.left) / (s.s + v);
}
return res;
}
static class Segment {
int left;
int right;
int ptr;
double s;
boolean alive = true;
double minEnergy;
double curEnergy;
double maxEnergy;
public Segment(int left, int right, double s) {
this.left = left;
this.right = right;
this.s = s;
}
}
}
static class InputReader { public BufferedReader reader; public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}
public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
}
查看更多关于协程原理从入门到精通 每个后端开发都需要掌握的高性能开发技术的详细内容...