[] Estructura de datos y estudio algoritmo de notas - "notas" algoritmo -12 [dicotomía]

Por el método de búsqueda secuencial, la complejidad del tiempo es O [n];
dicotomía de la complejidad del tiempo es O [log n].

Ejemplo:
[n-] = {} 1,3,4,6,7,8,10,11,12,15 subíndices encontraron en 6 y 9 A (insuficiencia -1)

#include "stdafx.h"
#include <cstdio>

int binaryS(int A[], int left, int right, int x)
{
	int mid;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (A[mid] < x)
			left = mid + 1;
		if (A[mid] > x)
			right = mid - 1;
		if (A[mid] == x)
			return mid;
	}
	return -1;
}

int main()
{
	int A[10] = { 1,3,4,6,7,8,10,11,12,15 };
	binaryS(A, 0, 9, 9);
	printf("%d\n%d\n", binaryS(A, 0, 9, 6), binaryS(A, 0, 9, 9));
	return 0;
}

Además pregunta: si se incrementa el elemento Una secuencia se puede repetir, a continuación, cómo la posición de un elemento dado X para averiguar, para obtener una primera secuencia de elemento x mayor que o igual a L y el primer elemento es mayor que x posición R, de modo que el elemento de secuencia x en presencia de la sección izquierda es intervalo abierto derecha cerrada.

1 sub-problemas:

//A[]为递增序列,x为欲查询的数,函数返回第一个大于等于x的元素的位置
//二分上下界为左闭右闭的[left,right],传入的初值为[0,n]
int lower_bound(int A[], int left, int right, int x)
{
	int mid;
	while (left < right)//left==right意味着找到唯一位置
	{
		mid = (left + right) / 2;
		if (A[mid] < x)
		{
			left = mid + 1;
		}
		else
		{
			right = mid;
		}
	}
	return left;//返回夹出来的位置
}

Sub Tema 2:

int upper_bound(int A[], int left, int right, int x)
{
	int mid;
	while (left < right)//left==right意味着找到唯一位置
	{
		mid = (left + right) / 2;
		if (A[mid] > x)
		{
			right = mid;
		}
		else
		{
			left = mid + 1;
		}
	}
	return left;//返回夹出来的位置
} 
		

Las diferencias entre los anteriores dos sub-problemas en que sólo A [mediados]> = 0 y A [mediados]> 0 (es decir, las condiciones que deben cumplirse)
Resolve "para encontrar una secuencia ordenada de elementos en condiciones de cumplir la primera condición" plantilla fija problema

Se reparte entre dos a la izquierda y la apertura a la derecha y el cierre de las condiciones del ciclo de zona debe dejarse + 1 <Derecha, Izquierda + 1 = allí se establece, de modo que la (izquierda, derecha] es la única posición para salir del bucle. Desde la apertura en una izquierda, izquierda el valor mínimo es menor que el valor inicial de una solución, por ejemplo, a partir del índice para la secuencia cero, izquierda y derecha se puede elegir para ser n-1 y la de regreso derecha

Dicotomía buscan la prescripción

#include <cstdio>
#include <algorithm>
using namespace std;
double eps = 10e-5;

double f(double x)
{
	return x * x;
}

double calSqrt(double a, double b, double out)
{
	double left = a, right = b, mid;
	while (right - left > eps)						//控制精度
	{
		mid = (left + right) / 2;
		if (f(mid) < out)
			left = mid;
		else
			right = mid;
	}
	return mid;
}

Hold problema del agua
Aquí Insertar imagen Descripción
f () / CALH () es lo que escribí, f0 () / solve () es un ejemplo del libro

#include <cstdio>
#include<math.h>
#include <algorithm>
using namespace std;
const double eps = 10e-5;
const double Pi = acos(-1.00);

double f(double R, double h)
{
	double L = sqrt(R*R - (R - h)*(R - h));
	double alpha = asin(L / R);
	//double alpha = r * pi;
	return (alpha * R*R / 2 - (R - h)*L / 2)*2;//Sr
}

double calh(double R, double r)
{
	double SR = R * R*Pi / 2, Sr;
	double left = 0, right = R, mid;
	double want = SR * r;
	while (right - left > eps)						//控制精度
	{
		mid = (left + right) / 2;
		if (f(R, mid) < want)
			left = mid;
		else
			right = mid;
	}
	return mid;
}

double f0(double R, double h)
{
	double alpha = 2 * acos((R - h) / R);
	double L = 2 * sqrt(R*R - (R - h)*(R - h));
	double S1 = alpha * R*R / 2 - L * (R - h) / 2;
	double S2 = Pi * R*R / 2;
	return S1 / S2;
}

double solve(double R, double r)
{
	double left = 0, right = R, mid;
	while (right - left > eps)
	{
		mid = (left + right) / 2;
		if (f0(R, mid) > r)
		{
			right = mid;
		}
		else {
			left = mid;
		}
	}
	return mid;
}
int main()
{
	double R, r;
	scanf("%lf%lf", &R, &r);
	printf("%lf\n%lf", calh(R,r),solve(R,r));
	return 0;
}

Para la expresión A B % m, hecho para bucle

for(int i = 0; i < b; i++)
{
	ans = ans * a % m;
}

Su complejidad del tiempo es O (b);
Pensamiento y media potencia (potencia rápidamente), la complejidad del tiempo es O (logb)
formulación recursiva

typedef long long LL;

//求a^b%m 递归写法
LL binaryPow(LL a, LL b, LL m)
{
	if (b == 0)	return 1;
	if (b % 2 == 0)
	{
		LL temp = binaryPow(a, b / 2, m);
		return temp * temp % m;
	}
	/*if (b % 2 != 0)*/
	else
	{
		LL temp = binaryPow(a, b - 1, m);
		return temp * a%m;
	}
}


int main()
{
	double R, r;
	scanf("%lf%lf", &R, &r);
	printf("%lf\n%lf", calh(R,r),solve(R,r));
	return 0;
}

En el código anterior, la condición si (b% 2 = = 1) se puede utilizar si (b & 1) en su lugar, puesto que el b & 1 para operación de bit, se determina b el último bit es 1, los rendimientos de circulación 1 cuando b es impar. Este enfoque puede mejorar la velocidad de ejecución.
Tenga en cuenta también que cuando b = 0% 2 no devuelve directamente binaryPow (a, b / 2% m) * binaryPow (a, b / 2% m), resultado en un aumento de la complejidad.
detalles:

  • Si una posible inicialmente mayor que o igual m, entonces que antes de entrar en una función de la módulo m
  • Si m es 1, puede ser juzgado directamente en la función externa es 0;

La redacción de la iteración
Aquí Insertar imagen Descripción

typedef long long LL;

//快速幂的迭代写法
LL binaryPow(LL a, LL b, LL m)
{
	LL  temp = 1;
	while(b>0)
	{
		temp *= a * (b & 1) % m;
	/*	if (b & 1)
		{
			temp = a*temp % m;
		}*/
		b /= 2;
		a = a * a%m;
	}
	return temp;
}

ejercicio

Encuentra x

Título Descripción
introduzca un número n, y a continuación, introduzca el valor n es diferente, entonces un valor de entrada x, el valor de salida del subíndice de la matriz (de 0, si la matriz es de salida 1).
Entrada
de prueba conjunto de datos múltiples, de entrada n (1 <= n <= 200), entonces el número de entradas de n, y la entrada x.
De salida
para cada conjunto de entrada, de salida.
entrada de la muestra
. 4
. 1 2. 4. 3
. 3
Salida de muestra
2

#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;


struct nu {
	int id;
	int num;
}a[210];

bool cmp(nu a, nu b)
{
	return a.num < b.num;
}

//找X
int main()
{
	int n;
	int x;
	int mid;
	int L, R;
	while (scanf("%d", &n) != EOF)
	{
		for (int i = 0; i < n; i++)
		{
			a[i].id = i;
			scanf("%d", &a[i].num);
		}
		scanf("%d", &x);
		sort(a, a + n, cmp);
		int left = 0, right = n;
		while (left<right)
		{
			mid = (left + right) / 2;
			if (a[mid].num >=x)
				right = mid;
			if(a[mid].num<x)
				left = mid+1;				
		}
		if (a[left].num == x)
		{
			L = left;
			//left = 0;
			//right = n;
			//while (left < right)
			//{
			//	mid = (left + right) / 2;
			//	if (a[mid].num > x)
			//	{
			//		right = mid;
			//	}
			//	else
			//	{
			//		left = mid + 1;
			//	}
			//}
			//R = left-1;
		//	for (int j = L; j <= R; j++)
		//	{
		//		printf("%d", a[j].id);
		//		if (j != R)
		//			printf(" ");
		//	}
		//	printf("\n");
			printf("%d\n", a[L].id);
		}
		else
			printf("-1\n");
	}
	return 0;
}

Este problema no sé lo que salió mal

buscar

Descripción Título
matriz de entrada de longitud n de
la matriz de entrada a [1 ... n]
de entrada para encontrar el número m de
entrada de las operaciones de búsqueda digital de b [1 ... m]
de salida Encontrar el SÍ o NO o SÍ NO.
Introduzca
de entrada múltiples conjuntos de datos.
Cada conjunto de entrada n, y a continuación, introduzca los números enteros n, m y luego de entrada, y a continuación, introduzca los números enteros m (1 <= m <= n <= 100).
Salida
Si la salida SÍ de la salida n matriz o NO.
entrada de la muestra
. 6
. 3 2. 5. 4. 7. 8
2
. 3. 6
ejemplo de salida

NO

#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;

void func(int a[],int b,int n)
{
	int left = 0, right = n-1;
	int mid;
	bool flag = false;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (b > a[mid])
			left = mid + 1;
		if(b< a[mid])
			right = mid - 1;
		if (b == a[mid])
		{
			flag = true;
			printf("YES\n");
			break;
		}
	}
	if (flag==false)
		printf("NO\n");
	return;
}

int main()
{
	int m, n;
	int forwardleft = 0;
	int a[110], b[110];
	while (scanf("%d", &n) != EOF)
	{
		for (int q = 0; q < n; q++)
			scanf("%d", &a[q]);
		sort(a, a + n);
		scanf("%d", &m);
		for (int q = 0; q < m; q++)
		{
			scanf("%d", &b[q]);
		}
		for (int q = 0; q < m; q++)
		{
			 func(a, b[q], n);
		}
	}
}
Publicado 43 artículos originales · ganado elogios 4 · Vistas 1212

Supongo que te gusta

Origin blog.csdn.net/weixin_42176221/article/details/101514928
Recomendado
Clasificación