Cómo implementar un programa en C para un polinomio como un tipo de datos abstractos (ADT)

En primer lugar, es importante que cualquier lector común tenga una idea general de qué es un tipo de datos abstractos (ADT) . Citando de CS13002 Programación y estructuras de datos

Un tipo de datos abstractos ( ADT ) es un objeto con una descripción genérica independiente de los detalles de implementación. Esta descripción incluye una especificación de los componentes a partir de los cuales está hecho el objeto y también los detalles de comportamiento del objeto.

Ahora, volvamos al problema. Deje que [matemática] P [/ matemática] [matemática] = [/ matemática] [matemática] a_ {0} [/ matemática] [matemática] + [/ matemática] [matemática] a_ {1} x ^ {1} [/ matemáticas] [matemáticas] + [/ matemáticas]…. [matemática] + [/ matemática] [matemática] a_ {n} x ^ {n} [/ matemática] puede ser un polinomio de grado [matemático] n [/ matemático] (el polinomio en múltiples variables se puede manejar de manera similar). Si tuviéramos que representar P usando el lenguaje C, entonces se podría usar el siguiente ADT:

1. Matriz simple: Sea A una matriz de tamaño n + 1 . Establezca [matemáticas] A [0] = a_ {0}, A [1] = a_ {1}, …, A [n] = a_ {n} [/ matemáticas].

Entonces, la matriz A es un ADT para el polinomio P.
Por ejemplo, si [matemáticas] P = 2 + 1x + 4x ^ {2} [/ matemáticas], entonces


Ahora, si hay múltiples polinomios con diversos grados, entonces se pueden hacer dos cosas:
(a) Encuentre el grado máximo de todos los polinomios y use una matriz de ese tamaño. No es muy difícil ver que es altamente ineficiente ya que cualquier polinomio con un grado inferior al grado máximo desperdiciará memoria.
Por ejemplo, deje que el grado máximo = 5 y P = x, entonces
(b) Obtenga el grado de polinomio en tiempo de ejecución y asigne dinámicamente la cantidad de memoria requerida a la matriz.

A continuación, echemos un vistazo a la compensación involucrada con el uso de una sola matriz como ADT polinomial.
Pros: (i) Muy fácil de construir.
(ii) La suma y multiplicación polinómica es fácil.
Contras: (i) Ineficiente para polinomios dispersos como se ve en el ejemplo anterior.
(ii) No es posible modificar el ADT para representar un polinomio de mayor grado.

2. Doble matriz: deje que haya k coeficientes distintos de cero en el polinomio P.
Que haya dos matrices unidimensionales A1 y A2 , ambas de tamaño k.

Establezca [math] A1 [i] = e_ {i}, i = 0,1,2… k-1 [/ math], donde [math] e_ {i} [/ math] son ​​exponentes en orden creciente con coeficientes cero

Establezca [matemática] A2 [i] = a_ {i}, i = 0,1,2… k-1 [/ matemática], donde [matemática] a_ {i} [/ matemática] es el coeficiente correspondiente al exponente [matemática ] e_ {i} [/ matemáticas].

Por ejemplo, deje que [math] P = 5 + 3x + 9x ^ {10} [/ math], luego [math] k = 3 [/ math] y [math] e_ {0} = 0, e_ {1} = 1, e_ {2} = 10, a_ {0} = 5, a_ {1} = 3, a_ {2} = 9 [/ matemáticas]. Luego


Aquí, A1 y A2 juntos actúan como un ADT para el polinomio P. Ahora, echemos un vistazo a la compensación:
Pros: (i) Fácil de construir.
(ii) Espacio eficiente incluso para polinomios dispersos.
Contras: (i) La adición y multiplicación de polinomios se vuelven difíciles.
(ii) No es posible modificar el ADT para representar un polinomio con más coeficientes distintos de cero.

3. Lista enlazada: como en el caso anterior, deje que haya k coeficientes distintos de cero en el polinomio P. Deje que haya una lista enlazada (individual o doblemente) L con k nodos. Cada nodo almacenará el valor del exponente y el correspondiente coeficiente distinto de cero. Es aconsejable organizar los nodos en orden creciente / decreciente de exponentes que almacenan.
por ejemplo, [matemáticas] P = 5 + 3x + 9x ^ {10} [/ matemáticas], luego [matemáticas] k = 3 [/ matemáticas]. L se verá así:


De acuerdo con la tradición, aquí está la compensación:
Pros: (i) Mantiene una estructura de datos única para almacenar exponentes y coeficientes (a diferencia de la doble matriz torpe).
(ii) Fácil de modificar, ya que la inserción y eliminación de nodos en una lista vinculada es muy conveniente.
Contras: (i) No es tan fácil de construir como las matrices.
(ii) La adición y multiplicación de polinomios se vuelve difícil.

Ahora que tiene tres ADT, esta pregunta surge naturalmente: ¿Cuál de ellos usar? Bueno, me gustaría actuar de manera perezosa y omitir esta parte diciendo: “Este es un ejercicio para el programador” .

ps: por supuesto, la elección de ADT depende de si estás limitado por la memoria o no 🙂 .

More Interesting

¿Por qué las matemáticas son mucho más difíciles que la programación?

¿Qué temas (en matemáticas y TCS) debe sobresalir un estudiante de matemáticas para seguir la teoría de la complejidad computacional?

Dada una matriz que consta de N enteros, ¿puedes encontrar el valor máximo de xor de dos números en una matriz (ai xor aj)?

Quiero ser excelente en matemáticas y programación, pero no tengo tiempo para ambos. ¿Cúal?

Si desmantelo un cubo de Rubik y luego lo vuelvo a montar de todas las formas posibles, ¿cuántos cubos distintos de Rubik son posibles?

¿Cómo podemos probar si un dispositivo informático en particular exhibe una aceleración cuántica?

¿Cómo juegan las matemáticas un papel importante en la programación?

Con la inmensa potencia de procesamiento en las computadoras actuales, ¿no podemos recurrir al sistema decimal para la informática?

Fallé miserablemente en mi programación práctica. También soy débil en matemáticas y pensamiento lógico. ¿Puedo alguna vez aprender programación?

¿Cuál es el significado de los idiomas [math] \ omega [/ math] en informática?

¿Qué es la justicia fuerte y la justicia débil en los métodos formales?

¿Cuáles son algunas de las ofertas de colocación dadas a los estudiantes de matemáticas de IIT-K? ¿Son equivalentes a los chicos de CS?

¿Qué tan importante es la teoría de probabilidad clásica para la computación cuántica?

¿Cómo es ser un experto en matemáticas trabajando como ingeniero de software?

En álgebra relacional, ¿cómo expresa la restricción de integridad que impone que cualquier valor bajo el atributo X en la relación A debe aparecer al menos una vez en la relación B?