Algoritmos y estructuras de datos (Edición Java) 01-Explicación detallada e implementación de código de matrices y colas dispersas

1 matriz dispersa

  • La llamada matriz dispersa es cuando la mayoría de los valores de contenido de la matriz no se utilizan (o son todos cero) y solo se utiliza una pequeña parte del espacio de la matriz. Esto da como resultado una pérdida de espacio de memoria.Para ahorrar espacio de memoria y no afectar los valores de contenido originales en la matriz, podemos usar matrices dispersas para comprimir datos.

1.1 Escenarios de aplicación de arreglos dispersos

inserte la descripción de la imagen aquí

1.2 Introducción básica a arreglos dispersos

  • Cuando la mayoría de los elementos en una matriz son 0, o el mismo valor, puede usar una matriz dispersa para almacenar la matriz
  • Cómo lidiar con arreglos dispersos
    • La matriz de registros tiene un total de varias filas y columnas, y cuántos valores diferentes hay
    • Reduzca el tamaño del programa grabando las filas y columnas de elementos con diferentes valores en una pequeña matriz

inserte la descripción de la imagen aquí

1.3 Aplicaciones de arreglos dispersos

inserte la descripción de la imagen aquí

  • Convierta una matriz 2D en una matriz dispersa
    • Atraviese la matriz bidimensional original para conocer el número total de datos válidos
    • Cree una matriz dispersa basada en la cantidad de datos válidos [matriz válida + 1]
    • Almacene datos válidos en una matriz 2D en una matriz dispersa
    • Escriba una matriz dispersa en el disco a través de IO
  • Convierta una matriz dispersa en una matriz bidimensional original
    • Lea la matriz dispersa del disco y cree la matriz bidimensional original de acuerdo con los datos en la primera fila como se muestra arriba int [15] [15]
    • Lea las pocas líneas de datos restantes en la matriz dispersa y asígnelas a una matriz bidimensional

1.4 Implementación de código de matriz dispersa

1.4.1 Crear una matriz bidimensional y asignar valores iniciales

/**
     * 二维数组初始化
     *
     * <p>
     *     这里模拟定义一个15*15的五子棋棋盘,并已知棋盘中已存在两个棋子
     *     来创建一个[15][15]的二维数组
     * </p>
     * @param
     * @return int[][]
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 15:22 2022/4/15
     **/
    public static int[][] twoDimensionalGoBang() {
        int goBang[][] = new int[15][15];
        goBang[3][3] = 1;
        goBang[4][4] = 2;
        return goBang;
    }
复制代码

1.4.2 Convierta la matriz bidimensional original en una matriz dispersa

/**
     * 二维数组转成稀疏数组
     *
     * <p>
     *     1.首先遍历原有的二维数组,得知原二维数组有效数据的总个数
     *     2.根据得知的有效数据来创建稀疏数组 [有效数据+1]
     *     3.将二维数据中有效数据的位置和值放到稀疏数组中
     * </p>
     * @param
     * @return int[][]
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 15:37 2022/4/15
     **/
    public static int[][] twoDimensionalToSparse() {
        //创建一个原始的二位数组
        int[][] goBang = twoDimensionalGoBang();
        //1.遍历原有的二维数组,得知有效数据数据的总个数
        int valid = 0;
        for (int i = 0; i < goBang.length; i++) {
            for (int j = 0; j < goBang.length; j++) {
                if (goBang[i][j] != 0) {
                    valid++;
                }
            }
        }
        //2.根据有效数据来创建稀疏数组
        int[][] sparse = new int[valid + 1][valid + 1];
        sparse[0][0] = goBang.length;
        sparse[0][1] = goBang.length;
        sparse[0][2] = valid;
        int count = 0;
        for (int i = 0; i < goBang.length; i++) {
            for (int j = 0; j < goBang.length; j++) {
                if (goBang[i][j] != 0) {
                    count++;
                    sparse[count][0] = i;
                    sparse[count][1] = j;
                    sparse[count][2] = goBang[i][j];
                }
            }
        }
        return sparse;
    }
复制代码

1.4.3 Convertir una matriz dispersa en una matriz bidimensional original

	public static void main(String[] args) {
        /**
         * <p>
         *     1.根据稀疏数组的特性已知其第一行存放为 二维数组的 行、列、值
         *     2.除第一行以外的数据其余存放的则是有效数据的 行、列、值
         * </p>
         */
        int[][] sparse = twoDimensionalToSparse();
        int[][] two = new int[sparse[0][0]][sparse[0][1]];
        for (int i = 1; i < sparse.length; i++) {
            //稀疏数组的第i行第0,1列为二维数组所在的位置 稀疏数组的第2列则为二维数组的值
            two[sparse[i][0]][sparse[i][1]] = sparse[i][2];
        }
        traverse(two);
    }
复制代码

1.4.4 Recorriendo una matriz bidimensional

/**
     * 二维数组遍历
     *
     * @param array 二维数组
     * @return void
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 15:22 2022/4/15
     **/
    public static void traverse(int[][] array) {
        for (int[] row : array) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }
复制代码

2 colas

  • Una cola es un tipo especial de tabla lineal. La característica especial es que solo permite operaciones de eliminación en la parte delantera de la tabla y operaciones de inserción en la parte posterior de la tabla. Al igual que las pilas, las colas son una operación sujeta a restricciones de la tabla lineal. El extremo que realiza la operación de inserción se denomina cola de la cola, y el extremo que realiza la operación de eliminación se denomina cabeza de la cola.

Por favor agregue la descripción de la imagen

2.1 Escenarios de aplicación de colas

  • Por ejemplo: se consideran colas los depósitos y retiros bancarios, las llamadas al hospital, etc.

2.2 Introducción básica a las colas

  • Una cola es una lista ordenada, que se puede implementar usando una matriz o una lista enlazada
  • Siga el principio de primero en entrar, primero en salir, es decir, los datos almacenados en la cola primero deben sacarse primero, y los datos almacenados después se sacarán.

2.3 Implementación de simulación de cola unidireccional

2.3.1 Usando una matriz para simular una cola

public class ArrayImitateQueue {
    /**
     * 数组最大容量
     */
    private int maxSize;
    /**
     * 队列头
     */
    private int front;
    /**
     * 队列尾
     */
    private int rear;
    /**
     * 存放数据
     */
    private int[] arr;

    public ArrayImitateQueue(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
        //指向队列头的前一个位置
        front = -1;
        //指向队列尾
        rear = -1;
    }

    /**
     * 判断队列是否已满
     *
     * @param
     * @return boolean
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 16:43 2022/4/15
     **/
    public boolean isFull() {
        return rear == maxSize - 1;
    }

    /**
     * 判断队列是否为空
     *
     * @param
     * @return boolean
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 16:44 2022/4/15
     **/
    public boolean isEmpty() {
        return rear == front;
    }

    /**
     * 向队列中添加数据
     *
     * @param num
     * @return void
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 16:46 2022/4/15
     **/
    public void addQueue(int num) {
        if (isFull()) {
            System.err.println("队列已满不能添加数据");
            return;
        }
        rear++;
        arr[rear] = num;
    }

    /**
     * 取出队列中的值
     *
     * @param
     * @return int
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 16:50 2022/4/15
     **/
    public int getQueue() {
        if (isEmpty()) {
            throw new RuntimeException("ERROR:index out of bounds");
        }
        front++;
        return arr[front];
    }

    /**
     * 显示队列中全部内容
     *
     * @param
     * @return void
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 16:50 2022/4/15
     **/
    public void showQueue() {
        if (isEmpty()) {
            System.err.println("Queue is Null~");
            return;
        }
        for (int i : arr) {
            System.out.println(i);
        }
    }

    /**
     * 获取队列的头数据
     *
     * @param
     * @return int
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 16:52 2022/4/15
     **/
    public int getFirstQueue() {
        if (isEmpty()) {
            throw new RuntimeException("ERROR:index out of bounds");
        }
        return arr[front + 1];
    }
}

复制代码

2.3.2 Uso de una lista enlazada para simular una cola

public class ChainImitateQueue<T> {
    private Node first;
    private Node last;
    private int n;

    /**
     * 在链表中添加数据
     *
     * @param item
     * @return void
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 17:09 2022/4/15
     **/
    public void addQueue(T item) {
        //在链表尾部插入结点
        Node oldLast = last;
        last = new Node();
        last.item = item;
        last.next = null;
        if (isEmpty()) {
            //队列插入第一个元素
            first = last;
        } else {
            oldLast.next = last;
        }
        n++;
    }

    /**
     * 删除链表中的头数据
     *
     * @param
     * @return T
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 17:10 2022/4/15
     **/
    public T removeQueue() {
        //在链表表头删除结点,(对单链表而言,不好删除表尾结点)
        if (isEmpty()) {
            //删除队列中最后一个元素
            throw new RuntimeException("ERROR: There is no more data in the queue to delete");
        }
        T item = first.item;
        first = first.next;
        n--;
        return item;
    }

    /**
     * 判断列表是否为空
     *
     * @param
     * @return boolean
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 17:10 2022/4/15
     **/
    public boolean isEmpty() {
        return n == 0 ? true : false;
    }

    /**
     * 获取列表的长度
     *
     * @param
     * @return int
     * @author ZhangSan_Plus
     * @description //TODO
     * @date 17:11 2022/4/15
     **/
    public int size() {
        return n;
    }


    class Node {
        Node next;
        T item;
    }

    public static void main(String[] args) {
        ChainImitateQueue<Integer> queue = new ChainImitateQueue<>();
        queue.addQueue(10);
        queue.addQueue(100);
        System.out.println(queue.size());
        System.out.println(queue.removeQueue());
        System.out.println(queue.removeQueue());
        System.out.println(queue.size());
        System.out.println(queue.removeQueue());
    }
}
复制代码

2.4 Implementación de simulación de cola circular

Supongo que te gusta

Origin juejin.im/post/7087787258555662344
Recomendado
Clasificación