我有一项任务是从单词中过滤一个列表(向量)作为前缀。该算法应该使用现代多核处理器。
解决方案是使用许多线程来处理列表。
// PrintWriter writer = new PrintWriter("C:\\DemoList.txt", "UTF-8");
//
// for(char i = 'A'; i<= 'Z'; i++) {
// for(char j = 'A'; j<= 'Z'; j++) {
// for(char n = 'A'; n<= 'Z'; n++) {
// for(char m = 'A'; m<= 'Z'; m++) {
// writer.println("" + i + j + n + m );
// }
//
// }
// }
// }
List<String> allLines = Files.readAllLines(Paths.get("C:\\", "DemoList.txt"));
Collections.shuffle(allLines);
String pattern = "AA";
List<String> result = new ArrayList<>();
int cores = Runtime.getRuntime().availableProcessors();
int threadsNum = allLines.size() / cores;
long start_time = System.nanoTime();
for (String word : allLines) {
if (word.startsWith(pattern))
result.add(word);
}
long end_time = System.nanoTime();
double difference = (end_time - start_time) / 1e6;
System.out.println("Time difference in Milliseconds with Brute-Force: " + difference);
//With Parallisim:
long new_start_time = System.nanoTime();
List<String> filteredList = allLines.parallelStream().filter(s -> s.startsWith(pattern))
.collect(Collectors.toList());
long new_end_time = System.nanoTime();
double new_difference = (new_end_time - new_start_time) / 1e6;
System.out.println("Time difference in Milliseconds with Stream from Java 8: " + new_difference);
结果:使用 Brute-Force 的时间差(以毫秒为单位):33.033602 使用 Java 8 的 Stream 的时间差(以毫秒为单位):65.017069
每个线程都应该从列表中过滤一个范围。
你有更好的主意吗?您认为我应该对原始列表进行排序而不是对其进行二分查找吗?我应该在二进制排序中也使用多线程,还是应该使用 Collections.sort?你将如何实施?
一只萌萌小番薯
呼啦一阵风
相关分类