Funções do algoritmo Bisect em Python
O bissectar O módulo em Python fornece funções simples e rápidas (baseadas em pesquisa binária) para pesquisar um elemento em uma lista classificada, encontrar a posição correta para inserir novos elementos e inserir novos elementos garantindo que a lista permaneça classificada.
Por que precisamos do Módulo Bisect?
- Útil para operações de pesquisa binária para pesquisar em uma lista ordenada e localizar pontos de inserção.
- Fornece métodos eficientes para inserir elementos em uma lista classificada enquanto mantém a ordem.
- Evita a necessidade de classificação manual após cada inserção, economizando tempo e esforço.
- Oferece funções como bisect() bisect_left() bisect_right() e insort() para código limpo e otimizado.
- Ideal para tarefas como manutenção de dados classificados em tabelas de classificação ou qualquer cenário que envolva inserção/pesquisa de dados classificados.
Funções principais do módulo Bisect
O módulo bisect oferece principalmente dois tipos de funcionalidades:
- Encontrando o ponto de inserção (sem inserção)
- Inserindo elementos na posição correta
1. Encontrando pontos de inserção
Estas funções retornam o índice onde o novo elemento deve ser inserido para manter a lista ordenada.
a) bisect.bisect(): Retorna o ponto de inserção mais à direita do elemento. Se o elemento já existir o ponto de inserção estará após as entradas existentes.
bisect.bisect(lista num beg=0 end=len(lista))
Parâmetro:
- lista: Lista ordenada.
- num: Elemento a inserir.
- implorar: Inicie o índice para pesquisa (opcional).
- fim: Índice final para pesquisa (opcional).
b) bisect.bisect_left(): Retorna o ponto de inserção mais à esquerda do elemento. Se o elemento existir, o ponto de inserção estará antes das entradas existentes.
bisect.bisect_left(lista num beg=0 end=len(lista))
c) bisect.bisect_right(): Idêntico a bisect.bisect() retorna o ponto de inserção mais à direita.
bisect.bisect_right(lista num beg=0 end=len(lista))
Exemplo: Encontre índices de inserção para o valor 4 em uma lista ordenada usando diferentes funções de bissecção.
Python import bisect li = [ 1 3 4 4 4 6 7 ] print ( bisect . bisect ( li 4 )) # right print ( bisect . bisect_left ( li 4 )) # left print ( bisect . bisect_right ( li 4 0 4 )) # subright
Saída
5 2 4
Explicação:
- bissetar (li 4): Retorna 5 porque encontra a posição mais à direita após os últimos 4 da lista (índice 4), portanto o ponto de inserção é 5.
- bisect_left(li 4): Retorna 2 porque encontra a posição mais à esquerda antes dos 4 primeiros da lista (índice 2).
- bisect_right(li 4 0 4): Funciona apenas na sublista isso[0:4] e retorna 4 porque insere 4 após os últimos 4 da sublista.
2. Inserindo Elementos
Essas funções inserem o elemento na posição adequada para manter a classificação.
a) bisect.insort(): Insere o elemento na posição mais à direita. Ao contrário das funções bisect(), isso na verdade modifica a lista inserindo o elemento.
bisect.insort(lista num beg=0 end=len(lista))
Parâmetro:
- lista: Lista ordenada.
- num: Elemento a inserir.
- implorar (opcional): Índice inicial para inserção (padrão 0).
- fim (opcional): Índice final para inserção (len (lista) padrão).
b) bisect.insort_left(): Insere o elemento na posição mais à esquerda.
bisect.insort_left(lista num beg=0 end=len(lista))
c) bisect.insort_right(): Insere o elemento na posição mais à direita (semelhante a insort()).
bisect.insort_right(lista num beg=0 end=len(lista))
Exemplo: Insira o valor 5 em uma lista ordenada, mantendo-a ordenada usando diferentes estratégias de inserção.
Python import bisect l1 = [ 1 3 4 4 4 6 7 ] l2 = [ 1 3 4 4 4 6 7 ] l3 = [ 1 3 4 4 4 6 7 ] bisect . insort ( l1 5 ) # right print ( l1 ) bisect . insort_left ( l2 5 ) # left print ( l2 ) bisect . insort_right ( l3 5 0 4 ) # subright print ( l3 )
Saída
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
Explicação:
- surgir(l1 5) insere 5 na posição adequada mais à direita – depois de todos os 4s e antes de 6.
- sort_left(l2 5) insere 5 na posição adequada mais à esquerda – o mesmo que insort aqui, já que 5 não está na lista.
- inserir_right(l3 5 0 4) insere 5 no índice 4 trabalhando apenas na sublista l3[0:4] = [1 3 4 4] após o último ≤ 5 nesse intervalo sem afetar o resto da lista.