Есть ли более эффективная реализация этого рекурсивного алгоритма в Grails? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть список «черт», L и база данных списков, с которыми я сопоставляюсь. Я хочу найти списки, которые содержат все черты в L. Если я еще не собрал 5, я удаляю одну черту из L и снова ищу полный список в базе данных. Порядок не имеет значения, меня интересует только точный список характеристик.

В настоящее время у меня есть рекурсивное решение, где я вырезаю один элемент в каждой позиции и снова сопоставляю. Он выполняет свою работу, но я хотел бы найти более эффективный метод, чтобы соответствовать этим спискам.

def match([1,2,3,4,5]) {

 findAllByTraits([1,2,3,4,5])  //[1,2,3,4,5,7,10] will match
                               //[2,3,4,5] will not match this iteration

 //if 5 lists not found
 match([1,2,3,4]) //without 5
 match([1,2,3,5]) //without 4
 match([1,2,4,5]) //without 3
 match([1,3,4,5]) //without 2
 match([2,3,4,5]) //without 1
}

Проблема, которую я сразу вижу, состоит в том, что это приведет к тому, что многие случаи будут вызываться многократно. Кроме того, в этом примере он завершит сопоставление ([1,2,3,4]), прежде чем перейти к другим случаям сопоставления. Это может привести к тому, что меньшие списки будут «сопоставлены» перед большими. Цель состоит в том, чтобы иметь 5 из максимально возможных списков.

...