Add three new distance formulas (#3203)

-Manhattan Distance
-Hamming Distance
-Minkowski Distance
This commit is contained in:
edison3701
2022-08-03 02:39:52 +08:00
committed by GitHub
parent 9b13852f20
commit 3918d9eaee
2 changed files with 119 additions and 27 deletions

View File

@ -1,11 +1,46 @@
package com.thealgorithms.maths;
public class DistanceFormula {
public static double distance(double x1, double y1, double x2, double y2)
{
public static double euclideanDistance(double x1, double y1, double x2, double y2) {
double dX = Math.pow(x2 - x1, 2);
double dY = Math.pow(y2 - x1, 2);
double d = Math.sqrt(dX + dY);
return d;
}
public static double manhattanDistance(double x1, double y1, double x2, double y2) {
double d = Math.abs(x1 - x2) + Math.abs(y1 - y2);
return d;
}
public static int hammingDistance(int[] b1, int[] b2) {
int d = 0;
if (b1.length != b2.length) {
return -1; // error, both array must be have the same length
}
for (int i = 0; i < b1.length; i++) {
d += Math.abs(b1[i] - b2[i]);
}
return d;
}
public static double minkowskiDistance(double[] p1, double[] p2, int p) {
double d = 0;
double distance = 0.0;
if (p1.length != p2.length) {
return -1; // error, both array must be have the same length
}
for (int i = 0; i < p1.length; i++) {
distance += Math.abs(Math.pow(p1[i] - p2[i], p));
}
distance = Math.pow(distance, (double) 1 / p);
d = distance;
return d;
}
}

View File

@ -1,28 +1,85 @@
package com.thealgorithms.maths;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class DistanceFormulaTest
{
public class DistanceFormulaTest {
@Test
void test1()
{
Assertions.assertEquals(DistanceFormula.distance(1,1,2,2), 1.4142135623730951);
void euclideanTest1() {
Assertions.assertEquals(DistanceFormula.euclideanDistance(1, 1, 2, 2), 1.4142135623730951);
}
@Test
void test2()
{
Assertions.assertEquals(DistanceFormula.distance(1,3,8,0), 7.0710678118654755);
void euclideanTest2() {
Assertions.assertEquals(DistanceFormula.euclideanDistance(1, 3, 8, 0), 7.0710678118654755);
}
@Test
void test3()
{
Assertions.assertEquals(DistanceFormula.distance(2.4,9.1,55.1,100), 110.91911467371168);
void euclideanTest3() {
Assertions.assertEquals(DistanceFormula.euclideanDistance(2.4, 9.1, 55.1, 100), 110.91911467371168);
}
@Test
void test4()
{
Assertions.assertEquals(DistanceFormula.distance(1000,13,20000,84), 19022.067605809836);
void euclideanTest4() {
Assertions.assertEquals(DistanceFormula.euclideanDistance(1000, 13, 20000, 84), 19022.067605809836);
}
@Test
public void manhattantest1() {
assertEquals(DistanceFormula.manhattanDistance(1, 2, 3, 4), 4);
}
@Test
public void manhattantest2() {
assertEquals(DistanceFormula.manhattanDistance(6.5, 8.4, 20.1, 13.6), 18.8);
}
@Test
public void manhattanTest3() {
assertEquals(DistanceFormula.manhattanDistance(10.112, 50, 8, 25.67), 26.442);
}
@Test
public void hammingTest1() {
int[] array1 = { 1, 1, 1, 1 };
int[] array2 = { 0, 0, 0, 0 };
assertEquals(DistanceFormula.hammingDistance(array1, array2), 4);
}
@Test
public void hammingTest2() {
int[] array1 = { 1, 1, 1, 1 };
int[] array2 = { 1, 1, 1, 1 };
assertEquals(DistanceFormula.hammingDistance(array1, array2), 0);
}
@Test
public void hammingTest3() {
int[] array1 = { 1, 0, 0, 1, 1, 0, 1, 1, 0 };
int[] array2 = { 0, 1, 0, 0, 1, 1, 1, 0, 0 };
assertEquals(DistanceFormula.hammingDistance(array1, array2), 5);
}
@Test
public void minkowskiTest1() {
double[] array1 = { 1, 3, 8, 5 };
double[] array2 = { 4, 2, 6, 9 };
assertEquals(DistanceFormula.minkowskiDistance(array1, array2, 1), 10);
}
@Test
public void minkowskiTest2() {
double[] array1 = { 1, 3, 8, 5 };
double[] array2 = { 4, 2, 6, 9 };
assertEquals(DistanceFormula.minkowskiDistance(array1, array2, 2), 5.477225575051661);
}
@Test
public void minkowskiTest3() {
double[] array1 = { 1, 3, 8, 5 };
double[] array2 = { 4, 2, 6, 9 };
assertEquals(DistanceFormula.minkowskiDistance(array1, array2, 3), 4.641588833612778);
}
}