У меня есть массив массивов имен, которые могут быть представлены в 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, как показано выше, а скорее древовидную структуру, которая представляет это.)
Что такое простой, эффективный код, который производит этот вывод?
У меня есть свое собственное решение, которое я опубликую в качестве ответа, но которое кажется мне менее чем идеальным.
Редактировать : Я забыл включить фактчто дерево должно быть отсортировано по убыванию на каждом уровне.Я добавил образцы узлов и изменил вывод, чтобы отразить это.