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,
- Implementar un método b absolutamente correcto que no sea lo suficientemente complejo,
- Implementar un generador de muestras aleatorias
- Formas de lograr la comparación
- Compare el método a con el método b muchas veces para verificar si el método a es correcto.
- 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?
- 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");
}
}