最も近いポイントのペアの問題
この問題では、n点のセットが2D平面上に与えられます。この問題では、距離が最小の点のペアを見つける必要があります。
この問題を解決するには、ポイントを2つに分割する必要があります。その後、2つのポイント間の最小距離が再帰的に計算されます。中央の線からの距離を使用して、ポイントはいくつかのストリップに分割されます。ストリップ配列からの最小距離を見つけます。最初に2つのリストがデータポイントで作成されます。1つのリストはx値で並べ替えられたポイントを保持し、もう1つはy値で並べ替えられたデータポイントを保持します。
このアルゴリズムの時間計算量はO(n log n)になります。
入力と出力
Input: A set of different points are given. (2, 3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4) Output: Find the minimum distance from each pair of given points. Here the minimum distance is: 1.41421 unit
アルゴリズム
findMinDist(pointsList、n)
入力: 与えられたポイントリストとリスト内のポイント数。
出力- 2点からの最小距離を見つけます。
Begin min := ∞ for all items i in the pointsList, do for j := i+1 to n-1, do if distance between pointList[i] and pointList[j] < min, then min = distance of pointList[i] and pointList[j] done done return min End
stripClose(strips、size、dist)
入力- ストリップ内のさまざまなポイント、ポイントの数、正中線からの距離。
出力- ストリップ内の2点からの最短距離。
Begin for all items i in the strip, do for j := i+1 to size-1 and (y difference of ithand jth points) <min, do if distance between strip[i] and strip [j] < min, then min = distance of strip [i] and strip [j] done done return min End
findClosest(xSorted、ySorted、n)
入力- x値で並べ替えられたポイント、y値で並べ替えられたポイント、ポイント数。
出力- ポイントのセット全体から最小距離を見つけます。
Begin if n <= 3, then call findMinDist(xSorted, n) return the result mid := n/2 midpoint := xSorted[mid] define two sub lists of points to separate points along vertical line. the sub lists are, ySortedLeft and ySortedRight leftDist := findClosest(xSorted, ySortedLeft, mid) //find left distance rightDist := findClosest(xSorted, ySortedRight, n - mid) //find right distance dist := minimum of leftDist and rightDist make strip of points j := 0 for i := 0 to n-1, do if difference of ySorted[i].x and midPoint.x<dist, then strip[j] := ySorted[i] j := j+1 done close := stripClose(strip, j, dist) return minimum of close and dist End
例
#include <iostream> #include<cmath> #include<algorithm> using namespace std; struct point { int x, y; }; intcmpX(point p1, point p2) { //to sort according to x value return (p1.x < p2.x); } intcmpY(point p1, point p2) { //to sort according to y value return (p1.y < p2.y); } float dist(point p1, point p2) { //find distance between p1 and p2 return sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y)); } float findMinDist(point pts[], int n) { //find minimum distance between two points in a set float min = 9999; for (int i = 0; i < n; ++i) for (int j = i+1; j < n; ++j) if (dist(pts[i], pts[j]) < min) min = dist(pts[i], pts[j]); return min; } float min(float a, float b) { return (a < b)? a : b; } float stripClose(point strip[], int size, float d) { //find closest distance of two points in a strip float min = d; for (int i = 0; i < size; ++i) for (int j = i+1; j < size && (strip[j].y - strip[i].y) < min; ++j) if (dist(strip[i],strip[j]) < min) min = dist(strip[i], strip[j]); return min; } float findClosest(point xSorted[], point ySorted[], int n){ if (n <= 3) return findMinDist(xSorted, n); int mid = n/2; point midPoint = xSorted[mid]; point ySortedLeft[mid+1]; // y sorted points in the left side point ySortedRight[n-mid-1]; // y sorted points in the right side intleftIndex = 0, rightIndex = 0; for (int i = 0; i < n; i++) { //separate y sorted points to left and right if (ySorted[i].x <= midPoint.x) ySortedLeft[leftIndex++] = ySorted[i]; else ySortedRight[rightIndex++] = ySorted[i]; } float leftDist = findClosest(xSorted, ySortedLeft, mid); float rightDist = findClosest(ySorted + mid, ySortedRight, n-mid); float dist = min(leftDist, rightDist); point strip[n]; //hold points closer to the vertical line int j = 0; for (int i = 0; i < n; i++) if (abs(ySorted[i].x - midPoint.x) <dist) { strip[j] = ySorted[i]; j++; } return min(dist, stripClose(strip, j, dist)); //find minimum using dist and closest pair in strip } float closestPair(point pts[], int n) { //find distance of closest pair in a set of points point xSorted[n]; point ySorted[n]; for (int i = 0; i < n; i++) { xSorted[i] = pts[i]; ySorted[i] = pts[i]; } sort(xSorted, xSorted+n, cmpX); sort(ySorted, ySorted+n, cmpY); return findClosest(xSorted, ySorted, n); } int main() { point P[] ={{2, 3}, {12, 30}, {40, 50}, {5, 1}, {12, 10}, {3, 4}}; int n = 6; cout<< "The minimum distance is " <<closestPair(P, n); }です。
出力
The minimum distance is 1.41421
-
M-着色の問題
この問題では、無向グラフが表示されます。 m色もご用意しております。問題は、グラフの2つの隣接する頂点が同じ色にならないように、m個の異なる色のノードを割り当てることができるかどうかを見つけることです。解決策が存在する場合は、どの頂点にどの色が割り当てられているかを表示します。 頂点0から始めて、色を1つずつ異なるノードに割り当てようとします。ただし、割り当てる前に、色が安全かどうかを確認する必要があります。隣接する頂点に同じ色が含まれているかどうかにかかわらず、色は安全ではありません。 入力と出力 Input: The adjacency matrix of a graph G(V, E)
-
頂点被覆問題
無向グラフの場合、頂点被覆は頂点のサブセットであり、グラフのすべてのエッジ(u、v)について、uまたはvのいずれかがセットに含まれます。 二分木を使用すると、頂点被覆問題を簡単に解決できます。 この問題は、2つのサブ問題に分けることができます。ルートが頂点被覆の一部である場合。この場合、ルートはすべての子エッジをカバーします。左右のサブツリーの頂点被覆のサイズを簡単に見つけて、ルートに1を追加できます。 入力と出力 Input: A binary tree. Output: The vertex cover is 3. アルゴリズム vertexCover(root node