none
Pesquisa Binária em lista de objetos RRS feed

  • Pergunta

  • Olá Pessoal!

    Eu tenho uma aplicação, onde estou usando EF Code First. Eu tenho uma class no EF que representa um molde, esse molde tem 3 principais propiedades, largura, altura e coluna.

    Na minha aplicação o usuário posta os valores do molde, e eu pesquiso no banco... Como estou usando Code-First, eu retorno o dbset e faço a pesquisa via Linq, utilizando as Where afins. Atualmente eu uso:

    WHERE(i => i.largura == x && i.altura == y && i.colunas == z);

    Também tenho um processo parecido, para achar os moldes próximos, para isso eu faço a pesquisa de uma range de +- 5...

    O processo funciona, mas para fins de estudo gostaria de fazer um método de pesquisa mais hardcore. Queria fazer essa pesquisa utilizando árvore binária (ou qualquer outro search method que seja mais rápido, idéias são bem vindas).

    Atualmente eu retornei a lista de moldes, e ordenei por Largura, depois Altura e depois Colunas, Utilizando classes que implementam a interface IComparer<> (nota na minha app os moldes se chamam knife, é complicado explicar, não vou entrar em detalhes ^^). Segue exemplo :

     KnifeComparerByWidth auxSortByWidth = new KnifeComparerByWidth();
     KnifeComparerByHeight auxSortByHeight = new KnifeComparerByHeight();
     KnifeComparerByColumns auxSortByColumns = new KnifeComparerByColumns();
    
     var knives = context.Knives.ToList();
     knives.Sort(auxSortByWidth);
     knives.Sort(auxSortByHeight);
     knives.Sort(auxSortByColumns);

    Ai estão os moldes, ordenados por largura, depois alturas, depois colunas... Agora vem a dúvida, o que fazer agora ? Qual melhor meio de pesquisar através dos parâmetros altura, largura e colunas ? Toda pesquisa que fiz pela internet só encontrei artigos onde a pesquisa era feita por BinarySearch, baseada em um objeto como parâmetro, retornando a index dele na list, mas não é isso que eu quero ...

    Espero ter ficado claro! Vlws! 


    Ao infinito e além!



    • Editado Fabio R. Luz quinta-feira, 1 de novembro de 2012 17:27
    quinta-feira, 1 de novembro de 2012 17:24

Respostas

  • Boa noite Fábio,

    achei interessante a sua abordagem e principalmente a sua intenção em otimizar sua busca, mas sugiro algo diferente. Passei por situações semelhantes onde precisei utilizar até 7 critérios de busca simultaneamente e a forma mais rápida de obter os resultados foi gerando um Hash. O Hash seria um número calculado com a combinação de seus 3 componentes (Width, Height e Columns), semelhante a um checksum e gravado em uma coluna que pode ser inclusive um campo calculado (desde que seja "denso", para que seja gravado fisicamente na base de dados). Uma vez que você tenha criado e armazenado o Hash, você pode indexar acoluna e efetuar suas buscas através dela e com muito mais desempenho.

    Não é exatamente o que solicitou, mas fica a sugestão.

    Abraços


    Daniel Cheida de Oliveira

    • Marcado como Resposta Fabio R. Luz sexta-feira, 1 de fevereiro de 2013 18:08
    sábado, 17 de novembro de 2012 23:15