[TypeScript] 고속 최단 거리를 계산하는 알고리즘 "workroid"
21778 단어 TypeScript계산법질문tech
가장 짧은 노선 탐색의 일종이다.
최단 경로 탐색
최단 노선 탐색이 바로 이런 문제다.
街が5個あります。
街と街の間は道で繋がっています。
街1から街5への最短距離を求めてください。
이 그림은 4인 것 같아요.
로봇의 장점
화사브로드는 모든 거리와 거리의 거리를 동시에 요구하는 알고리즘이다.
다섯 개의 거리가 있으면 모두 열 쌍이 있다.
이 열 가지는 모두 고속 계산을 할 줄 안다.
계산량은
街の数の3乗
이다.다른 가장 짧은 경로 탐색 알고리즘으로 X법이 유명하다.
옥스포드법은 특정한'어떤 거리에서 어떤 거리까지의 거리'를 찾는 데 뛰어난 알고리즘이다.
계산량은
(街の数+道の数)*log(街の数)
이다.그러니까 문제의 종류에 따라.
이렇게 구분하면 됩니다.
이루어지다
클라스를 사용했습니다.
사용법
코드
class WarchallFloyd {
private distances: number[][];
constructor(private n: number) {
this.distances = new Array(n);
for (let i = 0; i < n; i++) this.distances[i] = new Array(n);
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
this.distances[i][j] = NaN;
}
}
for (let i = 0; i < n; i++) this.distances[i][i] = 0;
}
min(a: number, b: number) {
console.assert(!(isNaN(a) && isNaN(b)));
if (isNaN(a)) return b;
if (isNaN(b)) return a;
return Math.min(a, b);
}
build() {
for (let k = 0; k < this.n; k++) {
// 経由する頂点
for (let i = 0; i < this.n; i++) {
// 始点
for (let j = 0; j < this.n; j++) {
// 終点
if (
isNaN(this.distances[i][j]) &&
(isNaN(this.distances[i][k]) || isNaN(this.distances[k][j]))
) {
this.distances[i][j] = NaN;
} else {
this.distances[i][j] = this.min(
this.distances[i][j],
this.distances[i][k] + this.distances[k][j]
);
}
}
}
}
}
answer(from: number, to: number): number {
return this.distances[from][to];
}
add(from: number, to: number, cost: number) {
this.distances[from][to] = cost;
this.distances[to][from] = cost;
}
}
예제
const wf = new WarchallFloyd(5);
wf.add(0, 1, 3);
wf.add(1, 4, 2);
wf.add(0, 2, 1);
wf.add(1, 2, 5);
wf.add(2, 3, 2);
wf.add(3, 4, 1);
wf.build();
for (let i = 0; i < 5; i++) {
const res = [];
for (let j = 0; j < 5; j++) {
res.push(wf.answer(i, j));
}
console.log(res);
}
// out
[ 0, 3, 1, 3, 4 ]
[ 3, 0, 4, 3, 2 ]
[ 1, 4, 0, 2, 3 ]
[ 3, 3, 2, 0, 1 ]
[ 4, 2, 3, 1, 0 ]
Reference
이 문제에 관하여([TypeScript] 고속 최단 거리를 계산하는 알고리즘 "workroid"), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/riku/articles/0633445d826daa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)