Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tgentil/busca-em-profundidade
Este projeto implementa um algoritmo de busca em profundidade para encontrar um subconjunto de números de uma lista que soma um valor específico.
https://github.com/tgentil/busca-em-profundidade
bfs-algorithm breadth-first-search python
Last synced: 26 days ago
JSON representation
Este projeto implementa um algoritmo de busca em profundidade para encontrar um subconjunto de números de uma lista que soma um valor específico.
- Host: GitHub
- URL: https://github.com/tgentil/busca-em-profundidade
- Owner: Tgentil
- Created: 2023-04-13T16:46:14.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2023-10-26T19:46:41.000Z (about 1 year ago)
- Last Synced: 2023-10-26T20:36:56.227Z (about 1 year ago)
- Topics: bfs-algorithm, breadth-first-search, python
- Language: Python
- Homepage:
- Size: 33.2 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.MD
Awesome Lists containing this project
README
# Projeto de Soma de Subconjuntos
[![GitHub](https://img.shields.io/badge/Visit-My%20Profile-0891B2?style=flat-square&logo=github)](https://github.com/Tgentil)
Este projeto implementa um algoritmo de busca em profundidade para encontrar um subconjunto de números de uma lista que soma um valor específico.
## Motivação
Criei este script porque desejava verificar se uma lista com vários lançamentos de vendas que compõem vários lotes de lançamentos continham um lote específico.## Estrutura do Projeto
O projeto está estruturado da seguinte maneira:
``` bash
busca_em_profundidade
├── archive
│ ├── debug
│ │ └── debug_teste.py
│ └── teste.py
└── project
├── code
│ └── achar_soma.py
└── test
├── debug
│ └── debug_achar_soma.py
└── generator
└── gerador_de_numeros.py
```O diretório `archive` contém o primeiro protótipo desenvolvido durante o projeto. O código presente nesta pasta tem uma eficiência bem reduzida em comparação ao código encontrado na pasta `project`.
Ao longo do desenvolvimento, foi necessário refatorar e otimizar o código na pasta `archive` para melhorar sua eficiência e escalabilidade.
O diretório `project` contém o código-fonte (`achar_soma.py`) e uma pasta de teste que contém um script de debug (`debug_achar_soma.py`) e um gerador de números para teste do script principal (`gerador_de_numeros.py`) a pasta `Project` representa a versão mais atualizada e eficiente da solução. Ele foi aprimorado com base nos resultados obtidos a partir do protótipo inicial e é capaz de lidar com um volume de dados muito maior. Além disso, ele incorpora funcionalidades adicionais e melhorias de desempenho.
Em resumo, a pasta `archive` contém o código original do primeiro protótipo, que pode ser útil para fins de referência, mas não é recomendado para uso atual devido à sua baixa eficiência. Recomendo o uso do código encontrado na pasta `project`, que representa a versão mais atualizada e eficiente da solução.
## Melhoria de Desempenho
O script tem uma complexidade O(2^n), Entretanto, algumas otimizações foram aplicadas para melhorar a performance. Uma delas foi a reorganização da lista em ordem decrescente, para que números maiores fossem utilizados primeiro, e a outra foi a mudança de caminho ao atingir uma soma maior do que o número desejado.
Com essas mudanças, o algoritmo agora é executado de forma mais eficiente e evita iterações desnecessárias. Como resultado, a execução do script agora é muito mais rápida do que antes.
## Utilização
Para utilizar o algoritmo, importe a função `find_sum` do módulo `achar_soma` e chame-a passando a lista de números e o valor alvo como argumentos:
```python
from project.code.achar_soma import find_sumNUMBERS = [0.50, 2, 2.50, 5, 7, 2.20] # exemplo
TARGET_SUM = 10.00 # Exemploif RESULT[0]:
print(f"\nEXISTE !! Subconjunto: {RESULT[1]} ")
else:
print("\nnão tem :(")```
O código acima irá verificar se há um subconjunto de NUMBERS que soma exatamente TARGET_SUM. Se encontrar um subconjunto, imprimirá " EXISTE !! ". Caso contrário, imprimirá " não tem :( ".
Nesse exemplo o terminal vai responder com
``` EXISTE !! Subconjunto: [5, 2.5, 2, 0.5] ```## Minha experiência
Ao utilizar o código antes ele rodava bem com conjuntos de até 20 números, agora roda fácilmente com arrays bem maiores e ainda retorna os valores utilizados para chegar ao resultado.
## Update de testes e limitações
Ao testar o script com o último update, em um input de 45 números houve uma melhora significativa da performance:
Input de teste:
```python
# Verifica se o script está sendo executado diretamente
if __name__ == '__main__':
NUMBERS = [ 116.08, 237.89, 19.60, 109.68, 111.31,
39.20, 65.63, 135.85, 299.79, 88.42,
278.80, 32.80, 39.20, 94.21, 156.10,
181.07, 83.93, 19.60, 127.76, 172.73,
100.00, 83.19, 19.60, 171.29, 39.20,
137.51, 39.20, 83.93, 124.20, 432.12,
349.43, 184.07, 113.20, 271.95, 19.60,
71.29, 124.04, 24.50, 19.60, 161.43,
49.23, 81.23, 247.62, 19.39, 88.66 ] # Exemplo de númerosTARGET_SUM = 2345.07 # Exemplo de soma desejada
```Saída do script antes:
```python
[Running] python -u "c:\busca em profundidade\project\code\achar_soma.py"EXISTE !!
[Done] exited with code=0 in 345.134 seconds
```Saída do script atualmente:
```python
[Running] python -u "c:\busca em profundidade\project\code\achar_soma.py"EXISTE !! Subconjunto: [432.12, 349.43, 299.79, 278.8, 271.95, 247.62, 172.73, 88.42, 83.19, 49.23, 32.8, 19.6, 19.39]
[Done] exited with code=0 in 3.277 seconds
```## Hardware utlizado para teste
CPU:
11th Gen Intel(R) Core(TM) i3-1115G4 @ 3.00GHz
Memória Ram:
8,0 GB
## Autores
* Thiago da Silveira Gentil