Algoritmo Zuo Shen 1-1 Notas

complejidad del tiempo

(1) Encuentre el valor máximo en la matriz
Inicialice una variable max, atraviese la matriz y compare con max (la comparación es una operación de nivel constante), la complejidad de tiempo es el producto de N y una constante

(2) Encuentre el número objetivo en la matriz ordenada.
Dicotomía: reduzca la mitad del costo cada vez: log2N

(3) Matriz ordenada A (longitud N), matriz ordenada B (longitud M) Averigüe la parte común de la matriz A y la matriz B
Idea 1:
Compare cada elemento en A con cada elemento en B
para (1 ... M) {para (1 ... N)}
Complejidad de tiempo: O (N * M)

Idea 2:
Búsqueda binaria
para (1 ... M) {Búsqueda binaria en A}
Complejidad de tiempo: O (N * logM)

Idea 3:
coloque un puntero en la posición inicial de cada matriz, compare, quienquiera que se mueva, definitivamente puede encontrar el mismo número y luego moverlos juntos, hasta N + M veces.
Complejidad de tiempo: O (N + M)

Complejidad espacial

(Espacio adicional: la entrada y la salida no se cuentan en el espacio adicional)
Reemplace el tiempo con espacio
(1) Cambie las partes izquierda y derecha de la matriz, como 123 45 salida 45 123.
Idea 1:
Encuentre una matriz auxiliar, copie el lado derecho a la matriz, y luego coloque el lado izquierdo Copiar a la matriz

Idea 2:
Primero invierta el orden de cada parte y luego invierta el orden
como un todo, como 12345 67
Orden inverso de cada parte: 54321 76
Orden inverso total: 67 12345
(El orden inverso no ocupa espacio adicional)

Logaritmo

Rol: Genere una gran cantidad de casos de prueba para verificar la corrección del programa.
Marco de construcción de logaritmos:
método a probar a,

  1. Implementar un método b absolutamente correcto que no sea lo suficientemente complejo,
  2. Implementar un generador de muestras aleatorias
  3. Formas de lograr la comparación
  4. Compare el método a con el método b muchas veces para verificar si el método a es correcto.
  5. Si hay una muestra que hace que la comparación sea incorrecta, ¿qué método de impresión del análisis de muestra es incorrecto?
  6. Cuando el número de muestras es grande, la prueba de comparación sigue siendo correcta y se puede determinar que el método a es correcto.

Ordenamiento de burbuja

public class bubbleSort0 {
    
    
    public static void bubble(int[] arr){
    
    
        if(arr == null || arr.length <2){
    
    
            return ;
        }
        for(int i = 0;i<arr.length;i++){
    
    
            for(int j = 0;j<arr.length-i-1;j++){
    
    
                if(arr[j]>arr[j+1]){
    
    
                    swap(arr,j,j+1);
                }
            }
        }
    }
    private static void swap(int[] arr,int a,int b) {
    
    
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
    public static void main(String[] args) {
    
    
        int[] a = {
    
    1,4,32,34,22,12};
        bubble(a);
        for(int i = 0;i<a.length;i++){
    
    
            System.out.println(a[i]);
        }
    }
}

Nota:
el siguiente método de intercambio es incorrecto:

    public static void swap_error(int a, int b) {
    
    
        int temp = a;
        a = b;
        b = temp;
    }

Este método se puede utilizar en C ++, pero no es válido en Java. La razón es que el tipo de datos básico de Java es la transferencia de valor. Los parámetros a y b en swap_error son parámetros formales. Los arr [j] y arr [j + 1] que llaman a este método son El parámetro actual, el parámetro actual pasa el valor a a, b, y el valor es intercambiado por el parámetro formal ab. Dado que no se pasa por referencia sino por valor, después de llamar a este método, arr [j] y arr [j + 1] todavía no tienen variedad

Introducir logaritmo:
generar una matriz aleatoria de tamaño aleatorio

 public static int[] generateRandomArray(int maxsize, int maxValue) {
    
    
        //Math.random():随机获得在0和1之间的一个数([0,1))  如果maxsize 是100 则arr的大小取值范围为[0,100]
        int[] arr = new int[(int) ((maxsize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
    
    
           //值是随机的
            arr[i] = (int) ((maxValue + 1) * Math.random() - (int) (maxValue * Math.random()));
        }
        return arr;
    }

El método absolutamente correcto:

 public static void comparator(int[] arr) {
    
    
        Arrays.sort(arr);
    }

Método de comparación:

 public static boolean isEqual(int[] arr1, int[] arr2) {
    
    
        if ((arr1 == null) && (arr2 != null) || (arr1 != null && arr2 == null)) {
    
    
            return false;
        }
        if (arr1 == null && arr2 == null) {
    
    
            return true;
        }
        if (arr1.length != arr2.length) {
    
    
            return false;
        }
        for (int i = 0; i < arr1.length; i++) {
    
    
            if (arr1[i] != arr2[i]) {
    
    
                return false;
            }
        }
        return true;
    }

Código general:

import java.util.Arrays;

public class bubbleSort {
    
    
    public static void bubbleSort(int[] arr) {
    
    
        if (arr == null || arr.length < 2) {
    
    
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
    
    
            for (int j = 0; j < arr.length - i - 1; j++) {
    
    
                if (arr[j] > arr[j + 1]) {
    
    
//                   int temp = arr[j];
//                   arr[j] = arr[j+1];
//                   arr[j+1] = temp;
                    swap(arr, j, j + 1);
                }
            }
        }
    }

    public static void swap(int arr[], int a, int b) {
    
    
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    public static void comparator(int[] arr) {
    
    
        Arrays.sort(arr);
    }

    public static int[] generateRandomArray(int maxsize, int maxValue) {
    
    
        //Math.random():随机获得在0和1之间的一个数([0,1))  如果maxsize 是100 则arr的大小可能是[0,100]
        int[] arr = new int[(int) ((maxsize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
    
    
            arr[i] = (int) ((maxValue + 1) * Math.random() - (int) (maxValue * Math.random()));
        }
        return arr;
    }

    public static boolean isEqual(int[] arr1, int[] arr2) {
    
    
        if ((arr1 == null) && (arr2 != null) || (arr1 != null && arr2 == null)) {
    
    
            return false;
        }
        if (arr1 == null && arr2 == null) {
    
    
            return true;
        }
        if (arr1.length != arr2.length) {
    
    
            return false;
        }
        for (int i = 0; i < arr1.length; i++) {
    
    
            if (arr1[i] != arr2[i]) {
    
    
                return false;
            }
        }
        return true;
    }

    public static int[] copyArray(int[] arr) {
    
    
        if (arr == null) {
    
    
            return null;
        }
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
    
    
            res[i] = arr[i];
        }
        return res;
    }

    public static void printArray(int[] arr) {
    
    
        if (arr == null) {
    
    
            return;
        }
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.println(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
    
    
        int testTime = 50000000;
        int maxSize = 100;
        int maxValue = 100;
        boolean succeed = true;
        for (int i = 0; i < testTime; i++) {
    
    
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArray(arr1);
            bubbleSort(arr1);
            comparator(arr2);
            if (!isEqual(arr1, arr2)) {
    
    
                succeed = false;
                printArray(arr1);
                printArray(arr2);
                break;
            }
        }
        System.out.println(succeed ? "nice" : "bad");
    }
}

Supongo que te gusta

Origin blog.csdn.net/stonney/article/details/111301970
Recomendado
Clasificación