Especialización en problemas de diseño de algoritmos de estructura de datos


Según información confiable, las preguntas de diseño de algoritmos se centran principalmente en:

Capítulos 2, 3, 7, 8



Respectivamente son

  • Capítulo 2 Tabla lineal

  • Capítulo 3 Pilas y colas

  • Capítulo 7 Búsqueda

  • Capítulo 8 Clasificación


principal

Cree una lista enlazada individualmente insertando antes y después de la inserción, y combínela en una lista enlazada ordenada

Problemas de diseño de algoritmos de ejercicios extraescolares de tablas lineales 1, 7

Empuje y haga estallar la pila de cadenas

Equipo de cadena

Encontrar por la mitad

Ordenamiento de burbuja

Ordenación rápida

Tipo de pila


Cree una lista enlazada individualmente insertando antes y después de la inserción, y combínela en una lista enlazada ordenada

Descripción del código:

void CreateList_H(LinkList& L, int n)
{
	L = new Lnode;
	L->next = NULL;
	for (int i = 0; i < n; ++i) {
		p = new Lnode;
		cin >> p->data;
		p->next = L->next;
		L->next = p;
	}
}


La complejidad del tiempo del algoritmo es O (n).

void CreateList_R(LinkList& L, int n) {
	L = new Lnode;
	L->next = NULL;
	r = L;
	for (i = 0; i < n; ++i) {
		p = new Lnode;
		cin >> p->data;
		p->next = null;
		r->next = p;
		r = p;
	}
}

La complejidad del tiempo del algoritmo es O (n).


void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc)
{
    
    
	pa = La->next;  pb = Lb->next;
	
	Lc = pc = La;  //用La的头结点作为Lc的头结点
	while (pa && pb)
	{
    
    
		if (pa->data < pb->data) {
    
     pc->next = pa; pc = pa; pa = pa->next; }
		//取较小者La中的元素,将pa链接在pc的后面,pa指针后移
		else if (pa->data > pb->data) {
    
     pc->next = pb; pc = pb; pb = pb->next; }
		//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移
		else //相等时取La中的元素,删除Lb中的元素
		{
    
    
			pc->next = pa; pc = pa; pa = pa->next;
			q = pb->next; delete pb; pb = q;
		}
	}
	pc->next = pa ? pa : pb;    //插入剩余段
	delete Lb;            //释放Lb的头结点
}

Problemas de diseño de algoritmos de ejercicios extraescolares de tablas lineales 1, 7

2. Problemas de diseño del algoritmo P53 (1) (7)

(1) Combine dos listas vinculadas ordenadas en aumento en una lista vinculada ordenada en aumento. Es necesario que la lista vinculada de resultados siga utilizando el espacio de almacenamiento de las dos listas vinculadas originales y no ocupe otro espacio de almacenamiento. No se permiten datos duplicados en la tabla.

¡lo mismo de arriba! ! !


(7) Diseñe un algoritmo para invertir la dirección de enlace de todos los nodos en la lista enlazada "in situ", es decir, solo se requiere el espacio de almacenamiento de la tabla original. En otras palabras, la complejidad espacial del algoritmo es 0 (1).

//利用的是前插法
void Do(LinkList& L) {
    
    

	//1->2->3->4
	r = L->next;
	L->next = NULL;
	while (r) {
    
    
		p = r->next;
		r->next = L->next;
		L->next = r;
		r = p;
	}
}

Empuje y haga estallar la pila de cadenas

void Push(LinkStack& L, SElemType e) {
    
    
	p = new StackNode;
	p->data = e;
	p->next = L;
	L = p;
}
void pop(LinkStack& L, SElemType e) {
    
    
	if (L == NULL)e = NULL;
	else
	{
    
    
		p = L;
		e = L->data;
		L = L->next;
		delete p;
	}
}

Encontrar por la mitad

int search_bin(SStable ST,keyType key){
    
    
low =1;
hight = ST.length;
while(low<=high
{
    
    
	mid = (low + high)/2;
	if(key == ST.R[mid].key)
		return mid;
	else if (key<ST.R[mid].key)
		high = mid-1
	else low = mid +1

}
return 0;


Ordenamiento de burbuja

void BubbleSort(Sqlist &L)
{
    
    
	m = L.length - 1 ;
	flag = 1;
	while ((m>0)&&(flag==1))
	{
    
    
		flage = 0;
		for (j=1;j<=m;j++){
    
    
			if(L.r[j].key>L.r[j+1].key)
			{
    
    
				flag = 1;
				t = L.r[j];
				L.r[j]=L.r[j+1];
				L.r[j+1] = t;
			}
			--m;
		}
	
	}
}



Suponiendo que la cola está representada por una lista circular vinculada con el nodo principal, y solo un puntero está configurado para apuntar al nodo del elemento final de la cola (nota: no se establece ningún puntero principal), intente escribir la cola vacía correspondiente, juzgue si la cola está vacía, ingrese y retire de la cola Y otros algoritmos

Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


Existe una famosa "función de Ackermann (Ackermann)" en matemáticas, que se define de la siguiente manera:

Inserte la descripción de la imagen aquí
(1) Escriba el algoritmo recursivo de Ack (m, n)

int Ack(int m, int n)
//Ack函数的递归算法
{
    
    
If(m==0)
   return n+1;
else if (m!=0 && n==0)
   return Ack(m-1, 1);
Else
   return Ack(m-1,Ack(m,m-1));
}

(2) Escriba un algoritmo no recursivo para calcular Ack (m, n)

int Ack(int m, int n)
//Ack函数的递归算法
{
    
    
    for(j=0;j<n;j++) 
    akm[0][j] = j+1;//得到Ack(0,n)的值
    for(i=0;i<m;i++)
    {
    
    
        akm[i][0] = akm[i-1][1];
        for(j=1;j<n;j++)
        akm[i][j] = akm[i-1][akm[i][j-1]];
    }
    return akm[m][n];
}

Supongo que te gusta

Origin blog.csdn.net/Touale/article/details/112971662
Recomendado
Clasificación