Ejercicio 3

Ejercicio 3

de Fabricio Gabriel Techera Rosado -
Número de respuestas: 1

Pense en trabajar el TAD como un array de punteros, 

typedef unsigned int nat;

typedef char *descripcion;

struct repPedidos{

nat Ident;

descripcion pedido;}

typedef repPedidos *TPedidos;

typedef TPedidos *ListaPedidos;

pero a medida planteaba soluciones me surgen mas dudas, 

Insertar un pedido con identificador i ∈ (0 ≤ i ≤ K) y descripción d, en una colección de pedidos p, siempre que no exista otro pedido con el mismo identificador i en p; en caso contrario la operación no tendrá efecto.

si fuera el caso de un array, como yo lo pense no tiene mucho sentido dar un i como pide la funcion insertar, ya que podria llevar el arreglo con tope e insertar en el siguiente al tope hasta que tope sea = k. 

/*Eliminar el pedido más antiguo (el primero ingresado) de una colección de pedidos no vacía y

devolver la descripción de dicho pedido.*/

Si quisiera implementar esta funcion en O(1) a diferencia de insertar que seria simplemente p[tope+1] = TPedidos; o P[i] = new TPedidos etc... que es una asignacion con un if previo para revisar si es vacia o no. No puedo realizarla, cada vez que borre un elemento tendria que o llevar la cuenta de que posicion del arreglo es el actual mas viejo o corres todos los elementos hasta el tope a la izquierda.

Como sugiere la letra pareciera que el TAD pedidos deberia ser realizado como una cola ( FIFO ) pero para insertar en una cola debo preguntarle a todos los elementos si su Identificador es igual a i y el peor caso de eso es O(n).

Podrian darme una mano en la resolucion, hay algo que no estoy tomando en cuenta?

En respuesta a Fabricio Gabriel Techera Rosado

Re: Ejercicio 3

de Facundo Benavides -

hola fabricio,

dejo algunos comentarios "sueltos"

- dado que el identificador de pedidos es un entero que pertenece a [0,k], podrías usar los índices del arreglo como identificadores. te ahorrás una variable y algo de lógica asociada a la actualización del campo Ident.

- como lo pensaste, la operación insertar tiene mucho sentido que reciba un id, ya que con el id ubicarías el pedido en tiempo O(1).

- también es correcto lo que pensaste luego: utilizar una cola para poder eliminar el último pedido en O(1). entonces, podrías usar ambas estructuras y mantenerlas "sincronizadas". ej, si eliminás de la cola, deberías "marcar" el pedido en el array como inexistente.

- esto nos lleva nuevamente al tema del identificador. para relacionar las estructura podés usar punteros o índices (dado que una de las estructuras es un array). cómo sea, necesitamos tener un campo que me permita "navegar" directo desde un nodo de la cola hasta una celda del array.

en resumen, podrías tener una cola con identificadores de pedidos o punteros a pedidos; y un array de descripciones y flag de existencia.

espero se entienda mejor ahora.

saludos