Предположим, у вас есть два вектора y
и x
с length(y) < length(x)
.Я хочу посчитать, как часто все элементы y
появляются в x
в одном и том же порядке. Могу предположить, что элементы y
появляются хотя бы один раз в x
в правильном порядке.
Пример:
y = c(10,20)
x = c(10,20,20,10,20)
Индексные парызначения y в x:
(1,2),(1,3),(1,5),(4,5)
, поэтому мой результат должен быть 4.
Я уже написал функцию:
countAllPositionsOfLCS <- function(y, x) {
potIndexList <- lapply(y, function(k) {
which(k == x)
})
previousIndices <- potIndexList[[1]]
counter <- length(potIndexList[[1]])
if (length(potIndexList) >= 2) {
for (k in 2:length(potIndexList)) {
newIndices <- potIndexList[[k]]
for (i in 1:length(previousIndices)) {
currentFittingInds <- newIndices[which(previousIndices[i] < newIndices)]
counter <- counter + length(currentFittingInds) - 1
}
previousIndices <- newIndices
}
}
counter
}
Я протестировал эту функциюс
c(10,20,30) and c(10,20,20,10,20,20,30,30)
Правильный результат должен быть 12, но функция говорит 10.
Индексные пары равны 1,2,7 | 1,2,8 | 1,3,7 | 1,3,8 | 1,5,7 | 1,5,8 | 1,6,7 | 1,6,8 | 4,5,7 | 4,5,8 | 4,6,7 | 4,6,8
.
Моя идея была следующей:
Прежде всего, я смотрю, где значения y появляются в x, и для каждого значения y я сохраняю индексы в списке potIndexList
.затем я просматриваю все элементы этого списка, скажем, что мы находимся в элементе potIndexList[[k]]
, поэтому у нас есть все индексы там, где k-й элемент y соответствует оператору x.Поскольку я хочу сохранить порядок y в x, я должен избавиться от некоторых индексов.Поэтому я проверяю индексы и проверяю previousIndices[i] < potIndexList[[k]]
.Если это TRUE
, я знаю, что порядок правильный.