Оглядываясь на ответ Итай, он выглядит так, как будто он читает файл тысячу раз после отбора одной строки кода, тогда как истинная выборка коллектора должна проходить только по «ленте» один раз. Я разработал некоторый код для перебора кода один раз с реальной выборкой коллектора на основе this и различных описаний в Интернете.
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;
}
}
Основной предпосылкой является то, что вы заполните резервуар, а затем вернуться к нему и заполнить случайных линий с шансом 1/ReservoirSize. Надеюсь, это обеспечит более эффективный код. Пожалуйста, дайте мне знать, если это не сработает для вас, поскольку я буквально сбил его через полчаса.
Реализация проб коллектора – Will
Удивительно. Никогда не слышал о пробке коллектора. Как насчет того, является ли мой файл MB? Существуют ли какие-либо проблемы с исполнением? Если да, есть ли альтернативы, чтобы избежать полного сканирования файлов? –
Правильно ли я полагаю, что это для фиксированного n = 1, где n - число «выборок»? Есть ли способ выбрать выбор более одного раза? поскольку это означает, что вы «переплетаете ленту» более одного раза или, по крайней мере, пытаетесь сделать это неэффективно. – Pureferret