Contando clasificación y algunos usos del mapa (descripción de c, c ++)

Cuenta ordenación y MAP

Ordenar por recuento

Primero use un
ejemplo 1:

input: ingrese n, la segunda línea ingrese los puntajes de n estudiantes, el rango de puntajes [0,100]
salida: la

estabilidad de la clasificación de n puntajes en este problema no necesita ser considerada, cualquier clasificación se puede resolver, aquí hay uno Una especie de clasificación, recuento y remo no comparativos.
Código anterior, descripción C ++

#include<bits/stdc++.h>
using namespace std;
int m[100]={
    
    0};
int main()
{
    
    int n=0,v=0,a=0,i=0,j=0,k=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
    
    
    scanf("%d",&a);//输入每个成绩
    m[a]++;//将每个值出现次数存入m数组,下标为该值
}
for(i=0;i<=100;i++)
{
    
    
    for(j=0;j<m[i];j++)
        printf("%d ",i);//按大小顺序以及出现次数输出
}
    return 0;
}

Primero observe la complejidad del tiempo, que está determinada por el rango y la distribución de los datos. Como antes, es incluso más rápido que cualquier otra clasificación cuando los datos se distribuyen uniformemente y el tamaño es apropiado. Pero cuando los datos se vuelven más amplios y complejos, la pérdida de tiempo y espacio se vuelve enorme. En circunstancias normales, es necesario abrir el espacio auxiliar, pero en el código anterior no es necesario.
De esto se puede ver que las condiciones de uso para contar: el rango de datos es pequeño, pero la cantidad de datos es grande;

Ejemplo 2:

entrada: una cadena compuesta de letras, longitud inferior a 1000
salida: ordena las letras de la cadena lexicográficamente y genera el

código anterior, descrito por C

#include<stdio.h>
#include<string.h>
int main()
{
    
    char s[1000];
int i=0,j=0,l=0,a[128]={
    
    0};
    gets(s);//实际上不建议使用这种输入方式
for(i=0;i<strlen(s);i++)
a[s[i]]++;//虽然开了辅助空间但长度极小
for(i=0;i<128;i++)
for(j=0;j<a[i];j++)
      printf("%c ",i);

    return 0;
}

Ante esta situación, se sabe que el rango ascii no supera los 128, y el efecto del ordenamiento por conteo es extremadamente prominente; se
puede observar que cuando el rango de datos es muy pequeño, el ordenamiento por conteo a veces tiene un efecto excelente. en la búsqueda de los elementos nth, así como la deduplicación y la re-verificación y otros problemas, también tienen espacio para jugar , y el código también es conciso y claro.
Pero cuando el rango de datos es enorme, los requisitos de tiempo y espacio de los métodos anteriores también aumentan. Cómo evitar el desperdicio es la primera dirección de optimización que podemos considerar. Aquí presentamos el mapa.

MAPA STL de C ++

Usted mismo puede buscar la definición y el uso del mapa. Aquí solo se describen algunas operaciones,
asumimos que el rango de valores de una sola puntuación es 0-10 ^ 9; nym <= 100000;

input: ingrese n, ingrese m, e ingrese los puntajes de n estudiantes en la segunda línea. Ingrese el
número de m en la tercera línea, lo que significa preguntar por el número de estos resultados, comenzando desde 1.
salida: muestra el número correspondiente a la primera aparición de la partitura.

Primero, este es un problema que se puede buscar mediante una matriz de conteo, pero si abre la matriz directamente, el tamaño de 10 ^ 9 será directamente tamaño demasiado grande,
pero si abrimos el mapa, daremos suficiente espacio;

int n,m;
map<int,int> f;//声明
int main(){
    
    
int a=0,i=0,j=0,n=0,m=0;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++){
    
    
		scanf("%d",&a);
		if(!f[a]){
    
    
			f[a]=i;//相同元素只记录第一次出现时序号
		}
	}
	for(i=1;i<=m;i++){
    
    
		scanf("%d",&j);
		if(!f[j]) 
		printf("-1 ");//若不存在
		else 
		printf("%d ",f[j]);
	}
	return 0;
}

Usamos map <int, int> para mantener un par de elementos, el primero es el tipo de clave (clave) y el segundo es el tipo de valor (valor). En esta pregunta, se sabe que el número de 10 ^ 5 no puede cubrir el rango de valores de 0-10 ^ 9, por lo que debemos tener mucho espacio desperdiciado en la matriz cuando ingresamos al depósito, pero el par clave-valor El método de almacenamiento proporcionado por el mapa es una solución perfecta Para resolver este problema, ya no necesitamos una matriz con una longitud de un solo rango de datos (maxV-minV). Si es solo un elemento de búsqueda, el tiempo y el espacio son completamente suficientes (de hecho, la operación se ha completado en el flujo de entrada en la pregunta anterior).
De hecho, la clasificación por conteo es uno de los casos más básicos de filas de cubos. Como clasificación no comparativa, el alcance de uso no es muy grande después de todo, pero sus ideas tienen margen de mejora y efectos especiales en muchos casos.

Supongo que te gusta

Origin blog.csdn.net/weixin_43736127/article/details/109610964
Recomendado
Clasificación