Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: DynCall no Protheus: Uma Nova Era na Integração com C/C++

_Créditos das imagens: ChatGPT 🚀 **DynCall no Protheus: Uma Nova Era na Integração com C/C++** Do meu ponto de vista, um dos recursos mais interessantes na nova versão do Protheus "Onça Preta" é a possibilidade de uso do **DynCall**. A linguagem AdvPL/TLPP, utilizada no Protheus, pode ser considerada um "superconjunto" de Clipper com FiveWin, mas com características e funcionalidades específicas voltadas para o ecossistema TOTVS. Um dos recursos marcantes do Clipper e de linguagens padrão xBase, como Harbour, é a possibilidade de incorporar código C/C++ diretamente no código-fonte. Até então, o Protheus não suportava isso nativamente. No entanto, com a introdução do **DynCall**, é possível simular essa integração ao carregar e executar funções de bibliotecas dinâmicas (DLLs) escritas em C ou C++. A seguir, comparamos os recursos das linguagens xBase padrão (exemplificadas pelo Harbour) com a implementação no Protheus via DynCall e apresentamos exemplos dos nov...

BlackTDN :: LeetCode :: Explorando a Solução do Problema "Median of Two Sorted Arrays" com xBase/TLPP



_Créditos das imagens: ChatGPT_

# LeetCode :: Explorando a Solução do Problema "Median of Two Sorted Arrays" com xBase/TLPP

No mundo da resolução de problemas algorítmicos, encontrar soluções eficientes é sempre um desafio. Um dos problemas clássicos amplamente abordados em plataformas como o LeetCode é o ["Median of Two Sorted Arrays"](https://leetcode.com/problems/median-of-two-sorted-arrays/). Neste post, quero compartilhar uma análise sobre três versões de implementações que criei utilizando a linguagem Harbour, no padrão xBase, e também destacar que há versões em TLPP disponíveis no repositório. A evolução entre as versões mostra como o refinamento de técnicas pode melhorar a eficiência de um algoritmo.

## O Problema
O objetivo é encontrar a mediana de dois arrays ordenados. Para isso, devemos criar um algoritmo que funcione com complexidade de tempo O(log(m+n)), onde `m` e `n` são os tamanhos dos arrays. Embora a implementação de uma solução eficiente não seja trivial, ela é alcançável com as técnicas certas.

## Versões Implementadas em Harbour/TLPP

Aqui estão as três versões que criei para resolver o problema. Todas estão disponíveis no meu [repositório no GitHub](https://github.com/naldodj/naldodj-xbase-leetcode-solutions):

### **Versão 4.1**: Combinação e Ordenação
[Código 4.1](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/004/median_of_two_sorted_arrays.4.1.prg)

A primeira abordagem é direta e utiliza a fusão dos dois arrays em um único array ordenado. Depois, a mediana é calculada com base na posição central desse array combinado. Embora simples, essa abordagem possui uma complexidade de tempo O((m+n) log(m+n)) devido ao custo da ordenação.

**Pontos Positivos:**
- Implementação simples e intuitiva.

**Pontos Negativos:**
- Ineficiente para arrays grandes, pois a complexidade não atende ao requisito de O(log(m+n)).

### **Versão 4.2**: Mesclagem Direta
[Código 4.2](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/004/median_of_two_sorted_arrays.4.2.prg)

Nesta segunda versão, eliminamos a necessidade de criar um array combinado. Utilizamos uma abordagem semelhante ao merge do algoritmo Merge Sort para encontrar diretamente a mediana. O algoritmo itera pelos elementos dos dois arrays de forma ordenada, mantendo apenas as informações necessárias para o cálculo da mediana.

**Pontos Positivos:**
- Complexidade reduzida para O(m+n).
- Menor uso de memória em comparação com a Versão 4.1.

**Pontos Negativos:**
- Embora mais eficiente, ainda não atende ao requisito de O(log(m+n)).

### **Versão 4.3**: Busca Binária e Divisão e Conquista
[Código 4.3](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/004/median_of_two_sorted_arrays.4.3.prg)

Na terceira versão, implementamos uma solução baseada em busca binária e divisão e conquista. Aqui, os dois arrays são tratados de forma assimétrica: sempre aplicamos a busca no menor dos dois arrays para reduzir a complexidade. A ideia central é dividir os arrays em duas partes de forma iterativa, verificando as condições necessárias para encontrar a mediana.

**Pontos Positivos:**
- Atende ao requisito de complexidade O(log(min(m, n))).
- Algoritmo elegante e eficiente para grandes entradas.

**Pontos Negativos:**
- Implementação mais complexa em comparação com as versões anteriores.

## Versões em TLPP

Também escrevi implementações em TLPP, que podem ser encontradas [neste diretório](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/tree/main/src/tlpp/004). As soluções seguem as mesmas abordagens utilizadas nas versões em Harbour, mas adaptadas à sintaxe e particularidades do TLPP. Isso demonstra a flexibilidade dessas linguagens no padrão xBase para resolver problemas de alta complexidade.

## Conclusão

A evolução dessas versões ilustra como é possível refinar soluções algorítmicas com técnicas mais sofisticadas. Da simplicidade da combinação e ordenação ao uso eficiente de busca binária, essas implementações mostram como a escolha da abordagem correta pode impactar diretamente a eficiência do código.

Espero que este post seja útil para quem deseja aprender mais sobre a resolução de problemas algorítmicos utilizando Harbour e TLPP. Se você tiver dúvidas ou sugestões, deixe um comentário! Vamos compartilhar conhecimento juntos.

---

#### Hashtags

#HarbourLang #xBase #Algoritmos #ProgramaçãoAvançada #DesenvolvimentoDeSoluções #LeetCodeBrasil #TLPP #DivisãoEConquista #BuscaBinária #SoluçõesEficientes

---

Comentários

Postagens mais visitadas