algorithms-for-computing-li.../LinearRegressionTool/src/main/java/de/wwwu/awolf/presenter/util/FastElementSelector.java

95 lines
2.3 KiB
Java

package de.wwwu.awolf.presenter.util;
import java.security.SecureRandom;
import java.util.Collections;
import java.util.List;
/**
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
*
* @Author: Armin Wolf
* @Email: a_wolf28@uni-muenster.de
* @Date: 29.06.2017.
*/
public class FastElementSelector {
/**
* Liefert das k-te Element aus der Eingabeliste zurück in Theta(n) Zeit.
*
* @param a Eingabeliste
* @param i Rang des gewünschten Elements
* @return das Element
*/
public static Double randomizedSelect(List<Double> a, double i) {
int start = 0;
int end = a.size() - 1;
if (i >= end + 1) {
return a.get(end);
}
while (true) {
if (start >= end) {
return a.get(start);
}
int q = randomizedPartition(a, start, end);
int k = q - start + 1;
if (i == k) {
return a.get(q);
} else {
if (i < k) {
end = q - 1;
} else {
start = q + 1;
i = i - k;
}
}
}
}
/**
* Hilfsmethode
*
* @param a Eingabeliste
* @param start Startindex
* @param end Index des letzten Elements
* @return Pivotelement
*/
private static int randomizedPartition(List<Double> a, int start, int end) {
int i = 0;
SecureRandom random = new SecureRandom();
//alternative: ThreadLocalRandom.current()
if (start < end) {
i = start + random.nextInt(end - start);
} else {
i = end + random.nextInt(start - end);
}
Collections.swap(a, end, i);
return partition(a, start, end);
}
/**
* Hilfsmethode
*
* @param a Eingabeliste
* @param start Startindex
* @param end Index des letzten Elements
* @return Pivotelement
*/
private static int partition(List<Double> a, int start, int end) {
Double x = a.get(end);
int i = start - 1;
for (int j = start; j <= end - 1; j++) {
if (a.get(j) <= x) {
i++;
Collections.swap(a, i, j);
}
}
Collections.swap(a, i + 1, end);
return i + 1;
}
}