Mirando la respuesta de Itay, parece que lee el archivo una y mil veces después de muestrear una línea del código, mientras que el muestreo del depósito real solo debería pasar por la 'cinta' una vez. He ideado un código para revisar el código una vez con muestreo de yacimiento real, basado en this y las diversas descripciones en la web.
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
public class reservoirSampling {
public static void main(String[] args) throws FileNotFoundException, IOException{
Sampler mySampler = new Sampler();
List<String> myList = mySampler.sampler(10);
for(int index = 0;index<myList.size();index++){
System.out.println(myList.get(index));
}
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class Sampler {
public Sampler(){}
public List<String> sampler (int reservoirSize) throws FileNotFoundException, IOException
{
String currentLine=null;
//reservoirList is where our selected lines stored
List <String> reservoirList= new ArrayList<String>(reservoirSize);
// we will use this counter to count the current line number while iterating
int count=0;
Random ra = new Random();
int randomNumber = 0;
Scanner sc = new Scanner(new File("Open_source.html")).useDelimiter("\n");
while (sc.hasNext())
{
currentLine = sc.next();
count ++;
if (count<=reservoirSize)
{
reservoirList.add(currentLine);
}
else if ((randomNumber = (int) ra.nextInt(count))<reservoirSize)
{
reservoirList.set(randomNumber, currentLine);
}
}
return reservoirList;
}
}
La premisa básica es que llenar el depósito, y luego volver a la misma y rellenar líneas al azar con una probabilidad de 1/ReservoirSize. Espero que esto proporcione un código más eficiente. Por favor, avíseme si esto no funciona para usted, ya que literalmente lo detuve en media hora.
Una implementación del muestreo de yacimientos – Will
Increíble. Nunca escuché sobre el muestreo de yacimientos. ¿Qué pasa si mi archivo es MB? ¿Hay algún problema de rendimiento? En caso afirmativo, ¿hay alternativas para evitar un escaneo completo de archivos? –
¿Estoy en lo correcto y suponiendo que esto es para un n = 1 fijo, donde n es el número de 'muestras'? ¿Hay alguna manera de elegir elegir más de uno a la vez? tal como está, usted 'repite la cinta' más de una vez, o al menos intenta lo que parece ineficaz. – Pureferret