Это вопрос: Есть N мальчиков и N девочек. Только мальчик и девочка могут сформировать танцевальную пару (т. Е. Не разрешены пары одного пола). Единственное другое условие при создании пар состоит в том, что их абсолютная разница в высоте должна быть меньше или равна K.Как повысить эффективность алгоритма при использовании Iterator в java?
Найти максимальное количество пар, которые могут быть сформированы так, чтобы у каждого был уникальный партнер.
Я хочу улучшить свой алгоритм, чтобы занять меньше времени .. сначала увидеть код:
//k is the maximum difference between pairs
int k = 5;
ArrayList<Integer> ArrBoys = new ArrayList<>(Arrays.asList(new Integer[]{28, 16, 22}));
ArrayList<Integer> ArrGirls = new ArrayList<>(Arrays.asList(new Integer[]{13, 10, 14}));
//sorting all arrays
Collections.sort(ArrBoys);
Collections.sort(ArrGirls);
System.out.println("After Sorting");
//printing arrays after sorting
for (Integer ArrBoy : ArrBoys) {
System.out.print(ArrBoy + " ");
}
System.out.println("");
for (Integer ArrGirl : ArrGirls) {
System.out.print(ArrGirl + " ");
}
System.out.println("");
//algorithm used to find the number of pairs
int count = 0;
for (Iterator<Integer> iteB = ArrBoys.iterator(); iteB.hasNext();) {
Integer ArrBoy = iteB.next();
for (Iterator<Integer> iteG = ArrGirls.iterator(); iteG.hasNext();) {
{
Integer ArrGirl = iteG.next();
int dif = (int) Math.abs(ArrBoy - ArrGirl);
if (dif <= k) {
System.out.println("we took " + ArrBoy + " from boys with "
+ ArrGirl + " from girls, thier dif < " + k);
ArrBoys.remove(ArrBoy);
ArrGirls.remove(ArrGirl);
iteB = ArrBoys.iterator();
count++;
break;
} else {
System.out.println("we try " + ArrBoy + " from boys with " + ArrGirl + " from grils but thier dif > " + (int) k);
//ArrGirls.remove(ArrGirl);
}
}
}
}
System.out.println("the number of pairs we can take is "+count);
выход этого кода:
Как вы видите этот алгоритм неэффективен, так как нам не нужно начинать сравнивать высоту с первой девушкой для второго мальчика, мы должны пойти к девушке, которая придет после предыдущей девушки, которую мы взяли в качестве пары.
Например: в мальчике с высотой 22, алгоритм должен начать сравнивать мальчиков с девушкой с 14-ю высотами, потому что мы уже сортируем их, если первый мальчик (короче) не может создать пару с первая девушка, так определенно, второй мальчик (дольше) тоже не может, мы теряем время, если сравним с первой девушкой.
Мы можем решить эту проблему двумя вариантами: либо начать итератор с девушкой после того, как предыдущий мальчик был остановлен (я не знаю, как это сделать с помощью итератора), либо удалив девушку из ArrayList один раз, если он не удовлетворяет условию и пусть петля начать с первой девушкой (я попробовал это, но это дает мне исключение)
Решить ее этими двумя способами, если вы можете ...
спасибо за вашу помощь, но я должен знать, как решить эту проблему с помощью итератора или удалить метод, ваш код такой хороший. –