Serie STL (dos) búsqueda binaria

Serie STL (dos) búsqueda binaria

Función: binary_search

  • Si hay una referencia de función que no se menciona en el artículo desconocido del contenido, consulte el artículo anterior STL series (1) sort use
  • Habrá muchas palabras similares pero diferentes en el contenido de este número. Lea atentamente, preste atención a la comparación, profundice la memoria y no sienta que el contenido es repetitivo y molesto.
  • Tenga en cuenta la declaración en negrita
  • Deja un mensaje o comentario

Uso uno (búsqueda básica)

contenido:

        binary_search( 数组名 + n1, 数组名 + n2,)
    
        n1和n2都是 int 类型的表达式 , 可以包含变量

        如果n1 = 0,+ n1 可以不写

        查找区间为下标范围为[n1,n2)的元素, 下标为n2的元素不在查找区间内 
                   
        在该区间内查找"等于"值的元素, 返回值为true(找到)false(没找到)
          
        "等于"的含义: a 等于 b <==> a < b和b < a都不成立

ejemplo:

	int a[] = {
    
     12,45,3,98,21,7 };
	sort(a, a + 6);
	Print(a, 6);       //结果: 3,7,12,21,45,98
	cout << "Result : " << binary_search(a, a + 6, 12) << endl;  //Result : 1
	cout << "Result : " << binary_search(a, a + 6, 77) << endl;  //Result : 0
  • Utilice ordenar antes de utilizar la búsqueda binaria STL;

Uso dos (búsqueda de reglas de clasificación personalizadas)

contenido:

Para ordenar por reglas de ordenación personalizadas, los elementos son matrices arbitrarias de tipo T para búsqueda binaria

binary_search(数组名 +n1 , 数组名 + n2 ,, 排序规则结果名() );
n1和n2都是int类型得表达式,可以包含变量

如果 n1 = 0 ,+ n1可以不写

查找区间为下标范围[n1,n2)的元素 , 下标为n2的元素不在查找区间内

在该区间内查找"等于"值的元素, 返回值为true(找到)false(没找到)

*查找时的排序规则,必须和排序时的规则一致!

"等于"的含义:  a 等于 b <==> "a必须在b前面""b必须在a前面"都不成立

Se han enfatizado muchas veces cosas importantes para profundizar la impresión ¡No es un artículo de agua!

ejemplo:

    int a[] = {
    
     12,45,3,98,21,7 };
	sort(a, a + 6, Rule1());   //按从小到大排序(此处使用Rule1规则进行排序)
	Print(a, 6);               // 21,12,3,45,7,98
	cout << "Result : " << binary_search(a, a + 6, 7) << endl;          //Result : 0
	cout << "Result : " << binary_search(a, a + 6, 8, Rule1()) << endl; //Result : 1
	return 0;

La cuarta línea del código anterior es el código incorrecto

Aquí, el valor de retorno del compilador de 0 no significa que no se haya encontrado.

binary_search () las reglas de búsqueda binaria deben ser consistentes con la intercalación ; de lo contrario, el valor de retorno no tiene sentido

Código completo: (incluidas las funciones personalizadas)

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
struct Rule1 {
    
    
	bool operator()(const int& a1, const int& a2)const {
    
    
		return a1 % 10 < a2 % 10;
	}
};

void Print(int a[], int size);

int main() {
    
    
	int a[] = {
    
     12,45,3,98,21,7 };
	sort(a, a + 6);
	Print(a, 6);
	cout << "Result : " << binary_search(a, a + 6, 12) << endl;
	cout << "Result : " << binary_search(a, a + 6, 77) << endl;
	sort(a, a + 6, Rule1());//按从小到大排序
	Print(a, 6);
	cout << "Result : " << binary_search(a, a + 6, 7) << endl;
	cout << "Result : " << binary_search(a, a + 6, 8, Rule1()) << endl;
	return 0;
}

void Print(int a[], int size) {
    
    
	int i;
	for (i = 0; i < size - 1; i++) {
    
    
		cout << a[i] << ",";
	}
	cout << a[i];
	cout << endl;
}

Función lower_bound

Uso uno (encuentre el límite inferior)

Busque en los tipos de datos básicos ordenados de pequeño a grande con el tipo de elemento T

T * lower_bound(数组名 + n1 , 数组名 + n2 ,);

Devuelve un puntero T * p;

* p es el elemento con el subíndice más pequeño en el intervalo de búsqueda, que es mayor o igual que "valor". Si no se encuentra, p apunta al elemento con el subíndice n2

Nota: ¡n2 no está en el rango de consulta!

ejemplo:

	int a[NUM] = {
    
     12,5,3,5,98,21,7 };
	sort(a, a + NUM);
	Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
	int* p1 = lower_bound(a, a + NUM, 5); //范围整个数组,p1指向下标最小的 大于等于5的元素
	cout << " p1指向的内容:"<< *p1 << "  下标:" << p1 - a << endl;   // 结果:5,1

Uso dos (reglas personalizadas para encontrar el límite inferior)

Busque en una matriz cuyo tipo de elemento sea T y se ordene de acuerdo con una regla de clasificación personalizada

T * lower_bound(数组名 + n1 , 数组名 + n2 ,, 排序规则结构名());

Devuelve un puntero T * p;

* p es el subíndice más pequeño en el intervalo de búsqueda. De acuerdo con una regla de clasificación personalizada, puede ordenar el elemento después del "valor". Si no puede encontrarlo, p apunta al elemento con el subíndice n2

Nota: ¡n2 no está en el rango de consulta!

ejemplo:

	int a[NUM] = {
    
     12,5,3,5,98,21,7 };
    sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)

Puede intentar analizar el motivo del siguiente contenido


Función upper_bound

Uso uno (encontrar límite superior)

contenido:

Busque en una variedad de tipos básicos ordenados de pequeño a grande con el tipo de elemento T

T * upper_bound(数组名 + n1 , 数组名 + n2 , 值);

Devuelve un puntero T * p;

* p es el elemento con el subíndice más pequeño en el intervalo de búsqueda y mayor que "valor". Si no se encuentra, p apunta al elemento con el subíndice n2

ejemplo:

	int a[NUM] = {
    
     12,5,3,5,98,21,7 };
	sort(a, a + NUM);
    Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
    int* p2 = upper_bound(a, a + NUM, 5); //范围整个数组,p2指向下标最小的 大于5的元素
	cout << *p2 << endl;  // 结果:7
	cout << *upper_bound(a, a + NUM, 13) << endl;//查找大于13的下标最小的元素值 结果 :21

Uso dos (regla personalizada para encontrar el límite superior)

contenido:

Busque en una matriz cuyos elementos sean de tipo T arbitrario y estén ordenados de acuerdo con una regla de clasificación personalizada

T * upper_bound(数组名 + n1 , 数组名 + n2 , 值 , 排序规则结构体());

Devuelve un puntero T * p;

* p es el elemento con el subíndice más pequeño en el intervalo de búsqueda. De acuerdo con las reglas de clasificación personalizadas, ** debe ** ser el elemento después de "valor". Si no se puede encontrar, p apunta al elemento con el subíndice n2

ejemplo:

	int a[NUM] = {
    
     12,5,3,5,98,21,7 };
    sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)
	cout << upper_bound(a, a + NUM, 18, Rule1()) - a << endl; // 结果 : 7 (无意义)(个位数大于8无法找到)(找不到时返回终点元素)
	if (upper_bound(a, a + NUM, 18, Rule1()) == a + NUM)
	cout << "not found" << endl;     // ==>not found;
	cout << *upper_bound(a, a + NUM, 5, Rule1()) << endl;      // 结果 : 7 (自己想想原因)
	cout << *upper_bound(a, a + NUM, 4, Rule1()) << endl;      // 结果 : 5

Código completo:

#include<iostream>
#include<algorithm>
#include<cstring>

#define NUM 7
using namespace std;
struct Rule1 {
    
    
	bool operator()(const int& a1, const int& a2)const {
    
    
		return a1 % 10 < a2 % 10;
	}
};
void Print(int a[], int size);

int main() {
    
    
	int a[NUM] = {
    
     12,5,3,5,98,21,7 };
	sort(a, a + NUM);
	Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
	int* p1 = lower_bound(a, a + NUM, 5); //范围整个数组,p1指向下标最小的 大于等于5的元素
	cout << " p1指向的内容:"<< *p1 << "  下标:" << p1 - a << endl;   // 结果:5,1
	int* p2 = upper_bound(a, a + NUM, 5); //范围整个数组,p2指向下标最小的 大于5的元素
	cout << *p2 << endl;  // 结果:7
	cout << *upper_bound(a, a + NUM, 13) << endl;//查找大于13的下标最小的元素值 结果 :21
	sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)
	cout << upper_bound(a, a + NUM, 18, Rule1()) - a << endl; // 结果 : 7 (无意义)(个位数大于8无法找到)(找不到时返回终点元素)
	if (upper_bound(a, a + NUM, 18, Rule1()) == a + NUM)
		cout << "not found" << endl;     // ==>not found;
	cout << *upper_bound(a, a + NUM, 5, Rule1()) << endl;      // 结果 : 7 (自己想想原因)
	cout << *upper_bound(a, a + NUM, 4, Rule1()) << endl;      // 结果 : 5
	return 0;
}

void Print(int a[], int size) {
    
    
	int i;
	for (i = 0; i < size - 1; i++) {
    
    
		cout << a[i] << ",";
	}
	cout << a[i];
	cout << endl;
}

Supongo que te gusta

Origin blog.csdn.net/zhuiyizhifengfu/article/details/113573619
Recomendado
Clasificación