Эффективное по времени построение частичного инвертированного индекса
Мне нужно построить частичноеInverted Index
, Что-то вроде:
l = {{x, {h, a, b, c}}, {y, {c, d, e}}}
iI[l]
(*
-> {{a, {x}}, {b, {x}}, {c, {x, y}}, {d, {y}}, {e, {y}}, {h, {x}}}
*)
Я думаю, что довольно ясно, что это делает. В списке ввода {x, y ...} уникальны, а {a, b, c, ..} - нет. Выход должен быть упорядочен#[[1]]
.
Прямо сейчас я делаю это:
iI[list_List] := {#, list[[Position[list, #][[All, 1]]]][[All, 1]]} & /@
(Union@Flatten@Last@Transpose@list)
Но это выглядит слишком запутанным для такой легкой задачи, кажется слишком медленным, и я должен быть в состоянии справиться с Легионом.
Тест-драйв для сравнения ваших результатов:
words = DictionaryLookup[];
abWords = DictionaryLookup["ab" ~~ ___];
l = {#, RandomChoice[abWords, RandomInteger[{1, 30}]]} & /@ words[[1 ;; 3000]];
First@Timing@iI[l]
(*
-> 5.312
*)
Итак, есть идеи для ускорения?