Estou procurando uma estrutura de dados altamente eficiente para armazenamento de dados semelhante à seguinte.
Tags de identificação Pedido1 Pedido2 -------------------------- 1 1,2 1 1 2 2,5 2 3 3 1,7 4 7 4 6 3 0
Eu preciso ser capaz de consultar essa estrutura de tal forma a que ele iria me dar uma lista de todos os ids contendo uma expressão de marcas - apoiar AND
e OR
e NOT
operações. Por exemplo. ((1 ou 2) e não 7)
Também preciso especificar a ordem dos resultados (Pedido1 ou Pedido2) e especificar o máximo de linhas retornadas com um deslocamento opcional. O desempenho para a busca dos primeiros 30-100 resultados é fundamental.
Por fim, preciso de uma maneira barata de pesquisar "relações de tags". Por exemplo, quero saber quais tags "se relacionam" com tags (1 OU 2) e com que frequência. Significado de quais tags aparecem no mesmo conjunto que 1 OU 2 ... ordenadas por frequência.
Alguma idéia de que estrutura de dados (ou conjunto de estruturas) seria altamente eficiente para esse tipo de trabalho?
(Gostaria de usar isso como uma prova de conceito para redesenhar as páginas marcadas da família de sites SE)
fonte
Respostas:
Esta não é exatamente uma resposta de uma estrutura de dados eficiente, mas sim uma elaboração dos comentários de @bbejot e @Kaveh, dando um argumento de ondulação para saber por que, dada a pergunta atual, não devemos esperar algo que seja muito melhor do que pesquisar no banco de dados inteiro. O argumento é baseado em uma redução do SAT, na hipótese do tempo exponencial e em muitas atividades manuais.
Não devemos esperar uma pesquisa eficiente no comprimento da consulta (por redução para SAT). Também não devemos esperar muito melhor do que olhar para todos os itens no banco de dados pela hipótese de tempo exponencial.
fonte
Esta é uma resposta bastante direta, mas acho eficaz:
Map Tag ([Id],[Id])
Map Id (Set Tag)
Id
fonte