Habilidades de dicotomia e pontos de atenção

1. Encontre o valor alvo de maneira ordenada:
O problema de "encontrar o valor alvo em um array segmentado" pode ser transformado no conhecido problema de "encontrar o valor alvo em um array ordenado" segmentando o array!

Fonte de ideias: Pergunta do botão Forçar: 1095. Encontre o valor alvo na matriz da montanha .
De acordo com o pico, a matriz da montanha é dividida em duas seções, "matriz ascendente" e "matriz descendente", e a pesquisa binária é realizada respectivamente.

2. Método de atualização intermediária:

int mid = (left + right) / 2;

Essa forma de escrever é adequada na maioria dos casos.Mas na cena em que esquerda e direita são particularmente grandes, esquerda + direita irão transbordar e obter um número negativo, O valor de mid também é negativo. A redação melhorada é:

int mid = left + (right - left) / 2;

3, a atualização das condições de contorno: evitar loop infinito
quando lefte righta diferença for 1 ou 0, se if elseaparecer a instrução dentro left = mid, haverá um loop infinito. Porque midsempre é igual left.

if (check(mid)) {
    
    
    // 下一轮搜索区间是 [mid + 1, right]
    left = mid;
} else {
    
    
    right = mid-1;
}

Deve ser modificado para arredondar:

int mid = left + (right - left + 1) / 2;
if (check(mid)) {
    
    
	left = mid;
} else {
    
    
    right = mid - 1;
}

Referência: introdução detalhada da dicotomia

Resumindo:

1, complexidade de tempo do algoritmo de busca binária de O (LGN);
2, se if elseocorrer dentro da instrução left = mid, modificada no meio para ser arredondada int mid = left + (right - left + 1) / 2;.

Acho que você gosta

Origin blog.csdn.net/qq_33726635/article/details/106785570
Recomendado
Clasificación