Если мне даны два произвольных числа, которые являются началом и концом (включительно) непрерывной последовательности натуральных чисел, каков эффективный способ в R найти самый маленький набор подстрок, которые «содержат» каждое число в этой последовательности из начало до конца?
Редактировать: Чтобы прояснить, что происходит, следующая ссылка имеет два примера, выбранных для представления различных случаев и для удобства просмотра. Наш фактический рабочий ввод включает в себя намного большие числовые последовательности с гораздо большим количеством цифр, поэтому наш текущий подход основан на рекурсии.
Первый пример имеет начальную точку 500 и конечную точку 699, что означает набор оперируются все числа чисел c от 500 до 699 включительно. Решение "5", потому что оно содержит каждую строку, символы которой начинаются с "5". IE от 500 до 599. Аналогично для "6".
Второй пример более сложный. Заданные начальная и конечная точки - от 533 до 555. Это означает, что первая часть решения - «533-539». Это не может быть просто «53», потому что это будет включать «530, 531, 532», которые не включены в заданный исходный диапазон. Таким образом, 533 - 539 должны быть перечислены полностью. Однако следующая часть решения на одну git короче, это всего лишь "54", потому что каждая перестановка "54X" от "540" до "549" включена. Затем последняя часть отсчитывает «550-555», потому что опять-таки не каждое число, которое может начинаться с подстроки «55», является частью данного диапазона.
Итак, вы можете увидеть, как это выглядит визуально, вот наш текущий код и некоторые примеры данных . Вы можете вставить это прямо в что-то вроде PHPtester. net и посмотреть, как каждая пара «начало» и «конец» превращается в набор подстрок.
Я пытался преобразовать это в R и заменить его циклы на векторизованные альтернативы или функции, такие как map
, насколько это возможно, но я все еще в основном следую его первоначальному решению:
Разделите всю последовательность от начала до конца на группы по 10, где "имя" каждой группы является родительской строкой (IE "55" = c (550: 559)).
Проверьте, какова длина каждой группы и, если ее длина меньше 10, экспортируйте ее в список вывода и удалите ее, в противном случае, если длина составляет 10 элементов, удалите ее и замените ее на one-di git -shorter подстрока.
Повторяйте процесс рекурсивно до тех пор, пока вы не перестанете получать группы длиной 10 элементов.
Я понял, что это напомнило мне о том, что Я смутно помню из теории множеств в бакалавриате. Существует ли пакет анализа строк или наборов, который уже решает эту конкретную проблему c? Или лучший способ для реализации этого решения? Прямо сейчас лучшая реализация R, о которой я могу думать, это в значительной степени опираться на purrr и dplyr для группирования и вложения / удаления вложений по мере необходимости, но инстинкт подсказывает мне, что это, вероятно, будет плохо масштабироваться, когда я начну бросать десятки тысяч начальных и конечных пар в это.
Я также готов дать python шанс, если это могло бы предложить намного лучшее решение, хотя я все еще новичок в этом и намного лучше знаком с R.