Я написал код для поиска дружных пар . В настоящее время это очень неэффективно, и я пытаюсь решить свои проблемы. Как часть этого, у меня есть функция areAmicablePairs(a,b)
, которая делает именно то, что вы ожидаете, за исключением того, что она не может обрабатывать случаи, когда a
или b
равны 1.
. попробуйте найти каждую дружную пару для a
и b
под некоторым номером n
, я пробежал which(outer(2:n,2:n,Vectorize(areAmicablePairs)),arr.ind = TRUE)
. Мне не потребовалось много времени, чтобы заметить очевидную неэффективность того, как вводятся данные для этой функции. В частности, есть повторение. Например, он проверит, являются ли 100 и 101 дружными парами, и позже проверит, равны ли 101 и 100, эквивалентному случаю.
Это дает мне мой вопрос, без сохранения списка в памяти или создания такого списка. и отфильтровывая его во время выполнения, оба из которых, я полагаю, очень неэффективны (я действительно не хочу хранить, скажем, список 20 000 на 20 000 в памяти), как я могу передать этой vecotrized функции список уникальных пар числа от 2 до п? Я мог бы сделать очень тщательно сконструированный для l oop, но существование таких функций, как apply
, mapply
и unique
, заставляет меня надеяться, что есть лучший способ.
Пример: Предположим, что я использую это как заполнитель для areAmicablePairs
:
areAmicablePairs<-function(a,b)
{
return(a==b)
}
Затем я пытаюсь запустить which(outer(2:1000,2:1000,Vectorize(areAmicablePairs)),arr.ind = TRUE)
без повторения эквивалентных входных данных, таких как a=5, b=2
и a=2, b=5
.