Я разработал приведенный ниже лог c, но он не может быть выполнен в данный момент Это займет более 4 секунд для набора тестовых данных из 100 000 номеров. Может кто-то предложить или оптимизировать его для запуска в течение 0,2 секунд для большого набора данных. Ниже приводится описание проблемы:
Радиоцентр получает некоторые сигналы и должен классифицировать их по частоте.
Центру известны стандартные частоты. Они идентифицировали
различных сигналов, которые должны быть классифицированы. Учитывая стандартные частоты сигналов freq_standard и частоты сигналов, подлежащих классификации freq_signal, вы можете помочь радиоцентру идентифицировать их?
Сигнал X принадлежит стандартному сигналу Y, если частота X ближе к частоте Y чем на любую другую частоту. Если оно равноудалено от двух известных частот, то выбирается сигнал с более высокой частотой.
Рассмотрим, например, freq_standard = [2, 3, 1, 4, 8] и freq_classify = [1, 5, 6]. Частоты 1 и 5 относятся к стандартным частотам 1 (индекс = 3) и 4 (индекс = 4) соответственно. Поскольку 6 равноудалено от двух стандартных частот 4 и 8, выберите более высокую частоту 8 (индекс = 5). Соответствующие классификации: [3, 4, 5].
Описание функции:
Завершите функцию classifySignals
в редакторе ниже. Функция должна возвращать целочисленный массив, обозначающий классификацию каждой частоты.
classifySignals
имеет два параметра -
Формат ввода:
Первая строка ввода содержит 2 пробела -разделенные целые числа: n,q
- количество строк и количество запросов.
Вторая строка содержит разделенные пробелом целые числа, массив freq_standard
.
Следующая строка содержит q
целые числа через пробел, массив freq_signals
.
Ограничения:
Формат вывода:
Печать q
строк: каждая строка должна содержать целое число, представляющее индекс стандартной частоты, соответствующий данному сигналу. Существует заглушка кода для обработки ввода / вывода, если вы решите ее использовать.
Пример ввода 0:
5 5
7 1 12 9 15
2 9 2000 13 4
Пример вывода 0:
2
4
5
3
1
Моя попытка:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Result1 {
/*
* Complete the 'classifySignals' function below.
*
* The function is expected to return an INTEGER_ARRAY. The function accepts
* following parameters: 1. INTEGER_ARRAY freq_standard 2. INTEGER_ARRAY
* freq_signals
*/
public static List<Integer> classifySignals(List<Integer> freq_standard, List<Integer> freq_signals) {
List<Integer> out = new ArrayList<>();
int match = 0;
int n = freq_standard.size();
int q = freq_signals.size();
List<Integer> freq_standard_unordered = new ArrayList<>(freq_standard);
Collections.sort(freq_standard);
for (int i = 0; i < q; i++) {
int signalToCompare = freq_signals.get(i);
if (signalToCompare < freq_standard.get(0)) {
match = freq_standard.get(0);
out.add(freq_standard_unordered.indexOf(match) + 1);
continue;
}
if (signalToCompare > freq_standard.get(n - 1)) {
match = freq_standard.get(n - 1);
out.add(freq_standard_unordered.indexOf(match) + 1);
continue;
}
int j = 0, k = n, mid = 0;
while (j < k) {
mid = (j + k) / 2;
if (freq_standard.get(mid) == signalToCompare) {
match = freq_standard.get(mid);
break;
}
if (signalToCompare < freq_standard.get(mid)) {
match = mid - 1 > 0
? findClosest(freq_standard.get(mid), freq_standard.get(mid - 1), signalToCompare)
: freq_standard.get(mid);
k = mid;
} else {
match = mid + 1 < n
? findClosest(freq_standard.get(mid + 1), freq_standard.get(mid), signalToCompare)
: freq_standard.get(mid);
j = mid + 1;
}
}
out.add(freq_standard_unordered.indexOf(match) + 1);
}
return out;
}
public static int findClosest(int n, int m, int target) {
if (Math.abs(n - target) == Math.abs(m - target)) {
return n;
}
if (Math.abs(n - target) > Math.abs(m - target)) {
return m;
} else {
return n;
}
}
}
public class GFG {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String[] firstMultipleInput = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");
int n = Integer.parseInt(firstMultipleInput[0]);
int q = Integer.parseInt(firstMultipleInput[1]);
String[] fTemp = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");
List<Integer> f = new ArrayList<>();
for (int i = 0; i < n; i++) {
int fItem = Integer.parseInt(fTemp[i]);
f.add(fItem);
}
String[] FTemp = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");
List<Integer> F = new ArrayList<>();
for (int i = 0; i < q; i++) {
int FItem = Integer.parseInt(FTemp[i]);
F.add(FItem);
}
List<Integer> ans = Result1.classifySignals(f, F);
System.out.println(ans);
}
}