Tenho um gráfico aleatório em R:
library(igraph)
library(tidyr)
set.seed(123)
g <- sample_gnm(n = 20, m = 20, directed = FALSE)
Estou tentando descobrir a menor distância entre cada nó.
Encontrei esta função no igraph chamada distances() e tentei implementá-la:
dist_df <- as.data.frame(distances(g)) %>%
mutate(node_i = 1:nrow(.)) %>%
pivot_longer(cols = -node_i,
names_to = "node_j",
values_to = "distance") %>%
mutate(node_j = as.numeric(gsub("V", "", node_j))) %>%
select(node_i, node_j, distance)
Verificando manualmente os resultados, eles parecem estar corretos:
# A tibble: 400 × 3
node_i node_j distance
<int> <dbl> <dbl>
1 1 1 0
2 1 2 2
3 1 3 3
4 1 4 4
5 1 5 4
6 1 6 3
7 1 7 Inf
8 1 8 3
9 1 9 Inf
10 1 10 Inf
Aqui está minha pergunta: Como a função distance() consegue funcionar tão rápido? Eu pensei que descobrir o caminho mais curto em gráficos é um processo computacionalmente intensivo - como essa função faz isso tão rápido? Essa é a função correta para esse problema?
Se você estiver curioso sobre " Por que ", sugiro que consulte o código-fonte digitando
?distances
(não sou especialista em teoria dos grafos, mas espero que o código abaixo possa lhe dar algumas pistas)onde você pode ver que há várias opções de algoritmos, e seu código-fonte pode ser encontrado https://github.com/igraph/igraph/tree/master/src/paths
Talvez você devesse ler sobre esses arquivos e acredito que você mesmo chegaria a essa conclusão.