У меня есть массив массивов имен, которые могут быть представлены в Ruby следующим образом:
samples = [
%w[a],
%w[a c],
%w[a],
%w[a],
%w[b],
%w[b],
%w[a],
%w[a e],
%w[a e],
%w[a c d],
%w[a c d],
%w[b],
%w[b c e],
%w[b c e],
%w[a c],
%w[a e],
%w[a e]
]
Это выходные данные профилировщика выборки, где каждый список имен представляет собой стек вызовов для конкретной выборки. Я хочу отобразить их как нисходящее дерево именованных значений, где значение в каждом узле представляет собой сумму обращений к этому конкретному пути вызова.
Для приведенного выше примера ввода дерево вывода должно быть:
root:0
a:4
e:4
c:2
d:2
b:3
c:0
e:2
(Мне не нужен вывод ASCII, как показано выше, а скорее древовидная структура, которая представляет это.)
Что такое простой и эффективный код, выдающий этот результат?
У меня есть собственное решение, которое я опубликую в качестве ответа, но оно кажется мне далеким от идеального.
Изменить: я забыл указать тот факт, что дерево должно быть отсортировано по убыванию на каждом уровне. Я добавил примеры узлов и изменил вывод, чтобы отразить это.