Nivel de abstracción

Autor: Zen y el arte de la programación informática

1. Introducción

Los niveles de abstracción son un tema de investigación importante en informática. Divide las diversas funciones y comportamientos del sistema informático según diferentes niveles, como su estructura organizativa, elementos estructurales y módulos funcionales. A través de un diseño de nivel de abstracción razonable, podemos comprender mejor el principio de funcionamiento del sistema, mejorar la eficiencia del desarrollo de software, reducir la dificultad de mantenimiento y aumentar la portabilidad y adaptabilidad del software. También existen algunas diferencias entre los diferentes niveles de abstracción: por ejemplo, los lenguajes de programación funcionales tienen un nivel de abstracción más alto que los lenguajes de programación imperativos. La división de niveles de abstracción también afectará el rendimiento y el consumo de recursos del software, reducirá la complejidad del sistema y mejorará la velocidad de ejecución. Este artículo discutirá la definición, clasificación y aplicación de los niveles de abstracción de software desde la perspectiva de la ingeniería de software.

2. Explicación de conceptos y términos básicos

2.1 Abstracción

La esencia de la abstracción es "ocultar información", es decir, ocultar las partes no observables de cosas o fenómenos reales, dejando solo los elementos, características, atributos, procesos o cambios que deben utilizarse. En el proceso de abstracción, los modelos o fenómenos del mundo real se clasifican y describen de acuerdo con ciertos estándares para comprender sus principales características, comportamientos y características, estableciendo así una comprensión simplificada del modelo o sistema del mundo real.

2.2 Nivel de abstracción

Los niveles de abstracción en informática siempre han sido un tema digno de exploración e investigación. En términos generales, existen cinco tipos de niveles de abstracción:

  1. Nivel de máquina: el nivel de abstracción de un sistema de hardware informático.
  2. Nivel del sistema operativo: el nivel de abstracción de los servicios proporcionados por el sistema operativo, como administración de archivos, programación de procesos, memoria virtual, etc.
  3. Nivel de programa: el nivel abstracto de la estructura lógica de un sistema de software, como clases, métodos, módulos, etc.
  4. Nivel de estructura de datos: el nivel de abstracción de estructuras de datos y algoritmos, como listas vinculadas, pilas, colas, árboles, etc.
  5. Nivel de dominio: el nivel de abstracción de un campo específico, como pedidos, inventario, pago, logística, etc. en el comercio electrónico.

2.3 Metas abstractas

El propósito de la abstracción es simplificar el análisis de problemas, el diseño y la implementación de soluciones. Los objetivos abstractos incluyen los siguientes aspectos:

  1. Mejorar la eficiencia del desarrollo: la abstracción puede reducir la dificultad para que los desarrolladores comprendan el mecanismo subyacente, mejorando así la eficiencia del desarrollo y ahorrando tiempo y costos.
  2. Mejorar la legibilidad del sistema: la abstracción puede hacer que la estructura general del software sea clara y fácil de leer y comprender, facilitando así el mantenimiento posterior.
  3. Reducir la dificultad de mantenimiento: la abstracción puede reducir la posibilidad de que los desarrolladores introduzcan errores al modificar el código y reducir la dificultad de mantenimiento.
  4. Mejorar la portabilidad y adaptabilidad del software: la abstracción puede mejorar la portabilidad y adaptabilidad del software y reducir la dependencia de plataformas específicas.
  5. Mejorar el rendimiento del software: la abstracción puede mejorar el rendimiento del software y aumentar la velocidad de ejecución optimizando el hardware o el software.

3. Explicación de los principios básicos del algoritmo, pasos operativos específicos y fórmulas matemáticas.

3.1 Algoritmo de árbol de expansión mínimo (MST)

Definición: en un gráfico no dirigido, en un subgrafo conectado con un número de nodos que no excede $ V $, el subgrafo que conecta dos vértices cualesquiera y tiene la suma más pequeña de pesos se denomina árbol de expansión mínima (MST).

3.1.1 Algoritmo de Kruskal

El algoritmo de Kruskal es un algoritmo codicioso para encontrar MST. Su idea principal es seleccionar un borde con el peso más pequeño cada vez y agregarlo al MST hasta que se agreguen todos los bordes. En su implementación, este algoritmo utiliza un método de fusión basado en rangos para determinar si dos conjuntos pertenecen al mismo bloque conectado.

Paso 1: clasifique todos los bordes por peso, de pequeño a grande
edges = [(7, 1), (9, 2), (8, 3), (5, 4), (3, 5)] # example edges list
sorted_edges = sorted(edges, key=lambda x:x[0]) # sort by weight
print(sorted_edges)

Producción:[(3, 5), (5, 4), (7, 1), (8, 3), (9, 2)]

Paso 2: agregue MST comenzando desde el primer borde
  • Seleccione un nodo en el árbol como nodo principal (establecido en 1).
  • Conecte 7 y 1 y seleccione uno de ellos como nodo principal en el árbol. En este momento, se selecciona 7 porque ya es el nodo raíz.
  • Conecte 9 y 2 y seleccione uno de ellos como nodo principal en el árbol. En este caso, se selecciona 2 porque está conectado a 1.
  • Conecte 8 y 3 y seleccione uno de ellos como nodo principal en el árbol. En este caso, se selecciona 3 porque está conectado a 2.
  • Conecte 5 y 4 y seleccione uno de ellos como nodo principal en el árbol. En este caso, se selecciona 5 porque está conectado a 3.
  • En este momento, el número de aristas es 5 y el tamaño del árbol es 4, cumpliendo las condiciones. Devolver resultados.
Implementación de código en Python
def find(parent, i):
    if parent[i]!= -1:
        return find(parent, parent[i])
    else:
        return i

def union(parent, rank, x, y):
    xroot = find(parent, x)
    yroot = find(parent, y)

    if rank[xroot] < rank[yroot]:
        parent[xroot] = yroot
    elif rank[xroot] > rank[yroot]:
        parent[yroot] = xroot
    else :
        parent[yroot] = xroot
        rank[xroot] += 1

def mst_kruskal(n, e, edges):
    result = []

    # Sort the given edges with respect to their weights
    sorted_edges = sorted(edges, key=lambda x:x[2]) 

    # Initialize Disjoint Set and Rank Arrays 
    parent = [-1]*n
    rank = [0]*n  

    for u, v, w in sorted_edges:  
        x = find(parent, u-1) 
        y = find(parent, v-1) 

        # If including this edge does't cause cycle, include it in result and join two sets. Else, discard it.
        if x!= y:
            result.append([u,v,w])
            union(parent,rank,x,y)

    return result

# Example Usage
vertices = 6 # Number of vertices
edges = [[1, 2, 1], [1, 3, 4], [2, 3, 2], [1, 4, 3], [3, 5, 2], [4, 5, 1]] # Edges List
result = mst_kruskal(vertices, len(edges), edges)
for s, t, c in result:
    print("Edge", "({}, {})".format(s,t), "- Weight:",c)

Producción:

Edge (1, 3) - Weight: 4
Edge (2, 3) - Weight: 2
Edge (3, 5) - Weight: 2

Supongo que te gusta

Origin blog.csdn.net/universsky2015/article/details/133565467
Recomendado
Clasificación