From 9d34b4b4d30a80914e0baa39577bfeea2301cc4e Mon Sep 17 00:00:00 2001 From: enqneres Date: Thu, 16 Oct 2025 16:19:50 +0000 Subject: [PATCH 1/4] Add LZW and Arithmetic Coding algorithms in compression category --- .../compression/ArithmeticCoding.java | 30 ++++++++++++++++ .../com/thealgorithms/compression/LZW.java | 34 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/main/java/com/thealgorithms/compression/ArithmeticCoding.java create mode 100644 src/main/java/com/thealgorithms/compression/LZW.java diff --git a/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java b/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java new file mode 100644 index 000000000000..3a4b55371094 --- /dev/null +++ b/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java @@ -0,0 +1,30 @@ +package com.thealgorithms.compression; + +import java.util.Map; + +public class ArithmeticCoding { + + public static double encode(String input, Map probabilities) { + double low = 0.0; + double high = 1.0; + + for (char symbol : input.toCharArray()) { + double range = high - low; + double cumProb = 0.0; + + for (Map.Entry entry : probabilities.entrySet()) { + char current = entry.getKey(); + double prob = entry.getValue(); + double next = cumProb + prob; + + if (symbol == current) { + high = low + range * next; + low = low + range * cumProb; + break; + } + cumProb = next; + } + } + return (low + high) / 2.0; + } +} diff --git a/src/main/java/com/thealgorithms/compression/LZW.java b/src/main/java/com/thealgorithms/compression/LZW.java new file mode 100644 index 000000000000..b7f0c881b456 --- /dev/null +++ b/src/main/java/com/thealgorithms/compression/LZW.java @@ -0,0 +1,34 @@ +package com.thealgorithms.compression; + +import java.util.*; + +public class LZW { + + public static List compress(String input) { + int dictSize = 256; + Map dictionary = new HashMap<>(); + for (int i = 0; i < 256; i++) { + dictionary.put("" + (char) i, i); + } + + String w = ""; + List result = new ArrayList<>(); + + for (char c : input.toCharArray()) { + String wc = w + c; + if (dictionary.containsKey(wc)) { + w = wc; + } else { + result.add(dictionary.get(w)); + dictionary.put(wc, dictSize++); + w = "" + c; + } + } + + if (!w.isEmpty()) { + result.add(dictionary.get(w)); + } + + return result; + } +} \ No newline at end of file From 5106e6b1c8a4799e778bc6280834e740455d9b64 Mon Sep 17 00:00:00 2001 From: enqneres Date: Thu, 16 Oct 2025 16:36:43 +0000 Subject: [PATCH 2/4] Add LZW and Arithmetic Coding algorithms in compression category --- .../java/com/thealgorithms/compression/ArithmeticCoding.java | 5 +++++ src/main/java/com/thealgorithms/compression/LZW.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java b/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java index 3a4b55371094..fe63ad852bcd 100644 --- a/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java +++ b/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java @@ -2,6 +2,11 @@ import java.util.Map; +/** + * Implementation of Arithmetic Coding algorithm. + * Reference: https://en.wikipedia.org/wiki/Arithmetic_coding + */ + public class ArithmeticCoding { public static double encode(String input, Map probabilities) { diff --git a/src/main/java/com/thealgorithms/compression/LZW.java b/src/main/java/com/thealgorithms/compression/LZW.java index b7f0c881b456..cc470322482f 100644 --- a/src/main/java/com/thealgorithms/compression/LZW.java +++ b/src/main/java/com/thealgorithms/compression/LZW.java @@ -2,6 +2,11 @@ import java.util.*; +/** + * Implementation of LZW (Lempel–Ziv–Welch) compression algorithm. + * Reference: https://en.wikipedia.org/wiki/Lempel–Ziv–Welch + */ + public class LZW { public static List compress(String input) { From a3c90f67e89a2eec651539768f54e37dc530b4b4 Mon Sep 17 00:00:00 2001 From: enqneres Date: Thu, 16 Oct 2025 16:53:41 +0000 Subject: [PATCH 3/4] Fix checkstyle issues in LZW and ArithmeticCoding classes --- .../thealgorithms/compression/ArithmeticCoding.java | 4 ++++ src/main/java/com/thealgorithms/compression/LZW.java | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java b/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java index fe63ad852bcd..e1e22599acb7 100644 --- a/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java +++ b/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java @@ -9,6 +9,10 @@ public class ArithmeticCoding { + private ArithmeticCoding() { + throw new UnsupportedOperationException("Utility class"); + } + public static double encode(String input, Map probabilities) { double low = 0.0; double high = 1.0; diff --git a/src/main/java/com/thealgorithms/compression/LZW.java b/src/main/java/com/thealgorithms/compression/LZW.java index cc470322482f..a0cc5e083f19 100644 --- a/src/main/java/com/thealgorithms/compression/LZW.java +++ b/src/main/java/com/thealgorithms/compression/LZW.java @@ -1,6 +1,9 @@ package com.thealgorithms.compression; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Implementation of LZW (Lempel–Ziv–Welch) compression algorithm. @@ -9,6 +12,10 @@ public class LZW { + private LZW() { + throw new UnsupportedOperationException("Utility class"); + } + public static List compress(String input) { int dictSize = 256; Map dictionary = new HashMap<>(); @@ -36,4 +43,4 @@ public static List compress(String input) { return result; } -} \ No newline at end of file +} From d53ba28471e5981563333aea41840404fd94cf63 Mon Sep 17 00:00:00 2001 From: enqneres Date: Thu, 16 Oct 2025 16:57:59 +0000 Subject: [PATCH 4/4] Fix: mark utility classes as final for Checkstyle compliance --- .../java/com/thealgorithms/compression/ArithmeticCoding.java | 2 +- src/main/java/com/thealgorithms/compression/LZW.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java b/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java index e1e22599acb7..59a9147bc69f 100644 --- a/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java +++ b/src/main/java/com/thealgorithms/compression/ArithmeticCoding.java @@ -7,7 +7,7 @@ * Reference: https://en.wikipedia.org/wiki/Arithmetic_coding */ -public class ArithmeticCoding { +public final class ArithmeticCoding { private ArithmeticCoding() { throw new UnsupportedOperationException("Utility class"); diff --git a/src/main/java/com/thealgorithms/compression/LZW.java b/src/main/java/com/thealgorithms/compression/LZW.java index a0cc5e083f19..d9d2acd571b8 100644 --- a/src/main/java/com/thealgorithms/compression/LZW.java +++ b/src/main/java/com/thealgorithms/compression/LZW.java @@ -10,7 +10,7 @@ * Reference: https://en.wikipedia.org/wiki/Lempel–Ziv–Welch */ -public class LZW { +public final class LZW { private LZW() { throw new UnsupportedOperationException("Utility class");