From a5562bdc9f0e55cfeabc8e4708248ff7e2e92447 Mon Sep 17 00:00:00 2001 From: K Samarth N Kamath Date: Sat, 9 Oct 2021 14:05:07 +0530 Subject: [PATCH 1/2] Create BinarySearch.cpp --- Programs/BinarySearch.cpp | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Programs/BinarySearch.cpp diff --git a/Programs/BinarySearch.cpp b/Programs/BinarySearch.cpp new file mode 100644 index 0000000..a4d83d5 --- /dev/null +++ b/Programs/BinarySearch.cpp @@ -0,0 +1,41 @@ +#include +using namespace std; + +// A recursive binary search function. It returns +// location of x in given array arr[l..r] is present, +// otherwise -1 +int binarySearch(int arr[], int l, int r, int x) +{ + if (r >= l) { + int mid = l + (r - l) / 2; + + // If the element is present at the middle + // itself + if (arr[mid] == x) + return mid; + + // If element is smaller than mid, then + // it can only be present in left subarray + if (arr[mid] > x) + return binarySearch(arr, l, mid - 1, x); + + // Else the element can only be present + // in right subarray + return binarySearch(arr, mid + 1, r, x); + } + + // We reach here when element is not + // present in array + return -1; +} + +int main(void) +{ + int arr[] = { 2, 3, 4, 10, 40 }; + int x = 10; + int n = sizeof(arr) / sizeof(arr[0]); + int result = binarySearch(arr, 0, n - 1, x); + (result == -1) ? cout << "Element is not present in array" + : cout << "Element is present at index " << result; + return 0; +} From b4b54ff19d921c710aa313500e97638fcc03541f Mon Sep 17 00:00:00 2001 From: K Samarth N Kamath Date: Thu, 14 Oct 2021 15:57:30 +0530 Subject: [PATCH 2/2] Create Closest_Pair_of_Points.cpp --- Programs/Closest_Pair_of_Points.cpp | 155 ++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 Programs/Closest_Pair_of_Points.cpp diff --git a/Programs/Closest_Pair_of_Points.cpp b/Programs/Closest_Pair_of_Points.cpp new file mode 100644 index 0000000..17727f8 --- /dev/null +++ b/Programs/Closest_Pair_of_Points.cpp @@ -0,0 +1,155 @@ +// A divide and conquer program in C++ to find the smallest distance from a +// given set of points. + +#include +#include +#include +#include +using namespace std; + +// A structure to represent a Point in 2D plane +struct Point +{ + int x, y; +}; + + +/* Following two functions are needed for library function qsort(). +Refer: http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/ */ + +// Needed to sort array of points according to X coordinate +int compareX(const void* a, const void* b) +{ + Point *p1 = (Point *)a, *p2 = (Point *)b; + return (p1->x != p2->x) ? (p1->x - p2->x) : (p1->y - p2->y); +} +// Needed to sort array of points according to Y coordinate +int compareY(const void* a, const void* b) +{ + Point *p1 = (Point *)a, *p2 = (Point *)b; + return (p1->y != p2->y) ? (p1->y - p2->y) : (p1->x - p2->x); +} + +// A utility function to find the distance between two points +float dist(Point p1, Point p2) +{ + return sqrt( (p1.x - p2.x)*(p1.x - p2.x) + + (p1.y - p2.y)*(p1.y - p2.y) + ); +} + +// A Brute Force method to return the smallest distance between two points +// in P[] of size n +float bruteForce(Point P[], int n) +{ + float min = FLT_MAX; + for (int i = 0; i < n; ++i) + for (int j = i+1; j < n; ++j) + if (dist(P[i], P[j]) < min) + min = dist(P[i], P[j]); + return min; +} + +// A utility function to find a minimum of two float values +float min(float x, float y) +{ + return (x < y)? x : y; +} + + +// A utility function to find the distance between the closest points of +// strip of a given size. All points in strip[] are sorted according to +// y coordinate. They all have an upper bound on minimum distance as d. +// Note that this method seems to be a O(n^2) method, but it's a O(n) +// method as the inner loop runs at most 6 times +float stripClosest(Point strip[], int size, float d) +{ + float min = d; // Initialize the minimum distance as d + + // Pick all points one by one and try the next points till the difference + // between y coordinates is smaller than d. + // This is a proven fact that this loop runs at most 6 times + 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; +} + +// A recursive function to find the smallest distance. The array Px contains +// all points sorted according to x coordinates and Py contains all points +// sorted according to y coordinates +float closestUtil(Point Px[], Point Py[], int n) +{ + // If there are 2 or 3 points, then use brute force + if (n <= 3) + return bruteForce(Px, n); + + // Find the middle point + int mid = n/2; + Point midPoint = Px[mid]; + + + // Divide points in y sorted array around the vertical line. + // Assumption: All x coordinates are distinct. + Point Pyl[mid]; // y sorted points on left of vertical line + Point Pyr[n-mid]; // y sorted points on right of vertical line + int li = 0, ri = 0; // indexes of left and right subarrays + for (int i = 0; i < n; i++) + { + if ((Py[i].x < midPoint.x || (Py[i].x == midPoint.x && Py[i].y < midPoint.y)) && li