Редактировать: добавлена конкретная реализация с использованием пакета partition
.
Как это описано, звучит как один из способов думать об этом, поскольку у вас есть 5 слотов с 4 диапазонами между ними (тире), с3 потенциальные стены, отделяющие диапазоны от соседних соседей.
| | |
1-2-3-4-5
Вы можете получить все комбинации, переключая каждый барьер со всех открытых:
0 0 0
1-2-3-4-5
one with class of sizes of 4
на все закрытые:
| | |
1-2-3-4-5
one case with class sizes of 1
1-2
2-3
3-4
4-5
Таким образом, все комбинации представляют собой двоичные числа от 000 (0) до 111 (7), всего 8, равное 2 ^ n, где n - количество стенок, которое является количеством элементовминус 2.
Один подход может использовать псевдокод, например, такой:
- Взять количество элементов - 2 = количество двоичных битов для представления всех решений
- Для каждого числаот 0 до 2 ^ (# элементов - 2), преобразовать в двоичный формат.
- Используйте позиции единиц для разделения диапазонов.
- Показать все диапазоны.
- ... Прибыль !!!
Похоже, есть хотя бы один пакетKage в R, который решает проблемы с разделами для вас.Вот реализация, использующая это и tidyverse
манипуляций.
library(tidyverse)
partitions::compositions(4) %>%
as.matrix() %>%
as_tibble() %>%
mutate(position = row_number()) %>%
gather(combo_num, segment_length, -position) %>%
filter(segment_length > 0) %>%
mutate(segment_label = paste0(position, "-", position + segment_length)) %>%
select(-segment_length) %>%
spread(position, segment_label)
# A tibble: 8 x 5
combo_num `1` `2` `3` `4`
<chr> <chr> <chr> <chr> <chr>
1 V1 1-5 NA NA NA
2 V2 1-2 2-5 NA NA
3 V3 1-3 2-4 NA NA
4 V4 1-2 2-3 3-5 NA
5 V5 1-4 2-3 NA NA
6 V6 1-2 2-4 3-4 NA
7 V7 1-3 2-3 3-4 NA
8 V8 1-2 2-3 3-4 4-5