Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

Protheus :: MSSQL :: Abstraindo com Full Outer Join

Dia deses precisei criar uma relação de [1:1] para efetuar um cálculo específico de rateio para contabilização do “Time Sheet” onde o valor de uma consulta subtrairia o  valor da consulta relacionada. Na correria não consegui solucionar o problema no cliente (estava na “hora do rush” e todos queriam ir embora) então levei a lição pra casa.

O Problema com o qual havia me deparado era o seguinte:

A Relação feita poderia resultar em: [ n : n ] , [ n  : ( n – 1 ) ] ou [ ( n – 1 ) :  n  ].

Quando [ n : n ] não teriamos problema, pois o conjunto de elementos n, na relação, seriam sempre equivalentes [ 1:1 ].

No segundo caso, em que a relação seria: [ n  : ( n – 1 ) ] também não teríamos problema, se a relação fosse da esquerda para a direita  uma vez que todo elemento do conjunto ( n – 1 ) estaria contido em n; o contrário não seria verdadeiro.

O mesmo poderíamos dizer quando a relação fosse: [ ( n – 1 ) :  n  ] com relacionamento da direita para a esquerda.

O problema: como definir a relação com apenas uma consulta?

Dependendo do relacionamento “da direita para esquerda / da esquerda para a direita”, poderíamos ter um sério problema: Elementos de n poderiam deixar de fazer parte da relação tornando o resultado final inconsistente.

Para a solução do Problema a relação deveria ser em ambas as direções, tanto da direita pra a esquerda quanto da esquerda para a direita. Neste caso teríamos uma relação do tipo: “FULL OUTER JOIN”.

OK. Consegui definir a relação. E os dados?

Em casa não tenho os dados para testar se o resultado da relação será ou não consistente.

A idéia, então, foi “ABSTRAIR”. Deveria “forçar” a relação de forma a “validar” o resultado. Para isso, usei duas tabelas, na qual tinha a certeza na possibilidade das relações [ n : n ], [ n : ( n - 1 ) ] e, se houvesse a relação [ ( n – 1 ) : n ], apesar dos dados estarem inconsistentes, seriam perfeitos para validar o algoritmo.

Essas tabelas seriam: SRA (Funcionários) : SRB (Dependentes) em que as relações possíveis são: [ n : n ], [ n : ( n - 1 ) ] sendo [ ( n – 1 ) : n ]  uma inconsistência (que no meu caso, uma bendita inconsistência).

Considerando que não teria os valores reais, precisaria simula-los. Então, para a coluna de valor utilizaria o campo R_E_C_N_O_ e para a relação RA_FILIAL :  RB_FILIAL e RA_MAT : RB_MAT

O Algoritmo, genérico, ficaria como:

image

que, baseado no seguinte Plano de Execução:

image

…me forneceria o seguinte resultado:

image

Os valores negativos são propositais, uma vez que de sua ocorrência, inverteriamos os Centros de Custo e Conta. Lembrando que esse é um exemplo ABSTRATO e que serviu apenas para validar o algorítimo. As tabelas e dados reais foram substituídos para a efetiva implementação.

Podemos observar que os resultados das “linhas” 1552:1556, apesar de inconsistêntes (existem dependentes sem funcionários), serviram para validar o algorítimo.

Problema resolvido!

Consulte (Microsoft:TechNet) :: Using Outer Joins para maiores detalhes.

Obtenha a “Query” do exemplo clicando aqui.

[]s

иαldσ dj

Comentários

  1. E a performance dessa query?

    ResponderExcluir
  2. A performance é satisfatória uma vez que os resultados principais são resolvidos e retornados pelas "subqueries" e a relação aplicada, apenas, aos resultados. De qualquer forma, analise o "Plano de Execução" para identificar possíveis gargalos buscando formas para otimizar a consulta.

    []s

    иαldσ dj

    ResponderExcluir
  3. Consulte o artigo: Exibindo planos de execução gráfica (SQL Server Management Studio)para maiores detalhes sobre "Planos de Execução"

    http://msdn.microsoft.com/pt-br/library/ms178071.aspx

    []s

    иαldσ dj

    ResponderExcluir
  4. Tem também: Tuning - Plano de Execução - Parte 1

    http://www.sqlmagazine.com.br/Colunistas/PauloRibeiro/08_Tunning_ExecutionPlan.asp

    ResponderExcluir
  5. Sugestão.

    Desmistificar o ACD!
    Tô frito!

    ResponderExcluir
  6. DESMISTIFICAR provém de "mistificar" e significa "acabar com o logro, desfazer a farsa, desmascarar".

    DESMITIFICAR provém de "mito" e significa "desfazer o mito, tirar o caráter de mito".

    Qual o Desejo? Acabar com o "Logro" ou o "Mito"? Não entendi????

    []s

    иαldσ dj

    ResponderExcluir
  7. Fazer oque vc sabe fazer.
    Desafiar o ACD para um post no blog...

    ResponderExcluir
  8. Ah, é isso. Tá desafiado. Qual a idéia?

    []s

    иαldσ dj

    ResponderExcluir
  9. ...to sem ideia, alias nem sei como isso funciona de fato!
    Por isso conto com vc, pois tudo que vc esmiuça eu entendo!

    VC EH O PAPAI!

    ResponderExcluir
  10. Apresente-me o seu amigo ACD. De onde ele veio? De traz do armazém. O que ele merece? a ....

    []s

    иαldσ dj

    ResponderExcluir
  11. (Merece a dor de cabeça de alguém!)

    Agora,
    Só um adendo sobre SQL, para quem tem curiosidade de ler comentários!

    http://msdn.microsoft.com/pt-br/library/bb510741(v=SQL.100).aspx

    ResponderExcluir
  12. tem outro desafio entao!

    precisei fazer uma crosstable, mas no advpl nao tem isso.

    Existem 2 caminhos, fazer via SQL ou criar uma manipulação via codigo AdvPL.

    Choose your destiny!

    ResponderExcluir

Postar um comentário

Postagens mais visitadas