From 9acea903216dbe371dd7b41cbf23b46a5732bcb4 Mon Sep 17 00:00:00 2001 From: Stefan Suhren Date: Sun, 7 Dec 2014 19:15:58 +0100 Subject: Refactored the packagenames fo better sorting --- .../in/inf/java1/aufgabe08/FloydAndBentley.java | 130 +++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 src/de/fhswf/in/inf/java1/aufgabe08/FloydAndBentley.java (limited to 'src/de/fhswf/in/inf/java1/aufgabe08/FloydAndBentley.java') diff --git a/src/de/fhswf/in/inf/java1/aufgabe08/FloydAndBentley.java b/src/de/fhswf/in/inf/java1/aufgabe08/FloydAndBentley.java new file mode 100644 index 0000000..8ba0a7a --- /dev/null +++ b/src/de/fhswf/in/inf/java1/aufgabe08/FloydAndBentley.java @@ -0,0 +1,130 @@ +/** + * + */ +package de.fhswf.in.inf.java1.aufgabe08; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * Utility class for the Floyd and Bentley algorithm. + * + * @author $Author: $ + * @version $Revision: $, $Date: $ UTC + */ +public final class FloydAndBentley +{ + + private static Random rnd = new Random(); + + /** + * Private constructor for utility class. + * + */ + private FloydAndBentley() + { + } + + /** + * A function which chooses a sample from a List with the Floyd and Bentley + * algorithm. (Recursive algorithm) + * + * @param + * Type of the Lists. + * @param s + * The set from which the sample is chosen. + * @param k + * The number of items to be chosen. + * @return Return the sample. + */ + public static List sample(List s, int k) + { + if (s.isEmpty()) + { + throw new IllegalArgumentException("Set is empty"); + } + if (k > s.size()) + { + throw new IllegalArgumentException("k is bigger than the Set"); + } + + List ret = new ArrayList<>(k); + sampleRec(s, k, ret); + + return ret; + + } + + /** + * The recursive implementation of the Floyd and Bentley algorithm. + * + * @param + * Type of the Lists. + * @param s + * The set from which the sample is chosen. + * @param k + * The number of items to be chosen. + * @param ret + * Return the sample. + */ + private static void sampleRec(List s, int k, List ret) + { + if (ret.size() >= k) + { + return; + } + + T val = s.get(rnd.nextInt(s.size() - (k - ret.size() - 1))); + + if (ret.contains(val)) + { + val = s.get(s.size() - (k - ret.size() - 1)); + } + + ret.add(val); + + sampleRec(s, k, ret); + + } + + /** + * A function which chooses a sample from a List with the Floyd and Bentley + * algorithm. (Non recursive algorithm) + * + * @param + * Type of the Lists. + * @param s + * The set from which the sample is chosen. + * @param k + * The number of items to be chosen. + * @return Return the sample. + */ + public static List sample2(List s, int k) + { + if (s.isEmpty()) + { + throw new IllegalArgumentException("Set is empty"); + } + if (k > s.size()) + { + throw new IllegalArgumentException("k is bigger than the Set"); + } + + List ret = new ArrayList<>(k); + + for (int i = 0; i < k; i++) + { + T val = s.get(rnd.nextInt(s.size() - (k - ret.size() - 1))); + + if (ret.contains(val)) + { + val = s.get(s.size() - (k - ret.size() - 1)); + } + + ret.add(val); + } + + return ret; + } +} -- cgit v1.2.3-70-g09d2