From 3918d9eaeeb305efe9ed3758fd26d51f40cc211c Mon Sep 17 00:00:00 2001 From: edison3701 <100289764+edison3701@users.noreply.github.com> Date: Wed, 3 Aug 2022 02:39:52 +0800 Subject: [PATCH] Add three new distance formulas (#3203) -Manhattan Distance -Hamming Distance -Minkowski Distance --- .../thealgorithms/maths/DistanceFormula.java | 45 +++++++- .../maths/DistanceFormulaTest.java | 101 ++++++++++++++---- 2 files changed, 119 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/DistanceFormula.java b/src/main/java/com/thealgorithms/maths/DistanceFormula.java index cc6ebc9ec..245aad9d8 100644 --- a/src/main/java/com/thealgorithms/maths/DistanceFormula.java +++ b/src/main/java/com/thealgorithms/maths/DistanceFormula.java @@ -1,11 +1,46 @@ package com.thealgorithms.maths; public class DistanceFormula { - public static double distance(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); + 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; } } diff --git a/src/test/java/com/thealgorithms/maths/DistanceFormulaTest.java b/src/test/java/com/thealgorithms/maths/DistanceFormulaTest.java index e54f12635..811eb4bf8 100644 --- a/src/test/java/com/thealgorithms/maths/DistanceFormulaTest.java +++ b/src/test/java/com/thealgorithms/maths/DistanceFormulaTest.java @@ -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 -{ - @Test - void test1() - { - Assertions.assertEquals(DistanceFormula.distance(1,1,2,2), 1.4142135623730951); - } - @Test - void test2() - { - Assertions.assertEquals(DistanceFormula.distance(1,3,8,0), 7.0710678118654755); - } - @Test - void test3() - { - Assertions.assertEquals(DistanceFormula.distance(2.4,9.1,55.1,100), 110.91911467371168); - } - @Test - void test4() - { - Assertions.assertEquals(DistanceFormula.distance(1000,13,20000,84), 19022.067605809836); - } +public class DistanceFormulaTest { + @Test + void euclideanTest1() { + Assertions.assertEquals(DistanceFormula.euclideanDistance(1, 1, 2, 2), 1.4142135623730951); + } + + @Test + void euclideanTest2() { + Assertions.assertEquals(DistanceFormula.euclideanDistance(1, 3, 8, 0), 7.0710678118654755); + } + + @Test + void euclideanTest3() { + Assertions.assertEquals(DistanceFormula.euclideanDistance(2.4, 9.1, 55.1, 100), 110.91911467371168); + } + + @Test + 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); + } }