Registro de ARTES para la cuarta semana, siéntete a gusto

introducción

El tiempo vuela tan rápido que ya es la cuarta semana de aprendizaje y control, y también es la última semana de este evento. Cualquiera que conozca Shopkeeper 3 debe saber que he estado creando blogs técnicos durante 6 años y publico regularmente no menos de 6 publicaciones de blog cada mes. Al mismo tiempo, como desarrollador al que le encanta compartir, actividades como ARTS son naturalmente indispensables para mí. Como planeo compartirlos juntos, he grabado documentos locales antes, así que puedo integrar el contenido y luego comenzaré mi registro de la cuarta semana.

Algoritmo

Esta semana quiero compartir una pregunta de algoritmo más clásica, que también es una pregunta de algoritmo clásica de Leetcode-449 ( sitio web oficial de LeetCode, una plataforma de crecimiento tecnológico amada por los geeks de todo el mundo ): Problema del árbol de búsqueda de bifurcación de serialización y deserialización 2.

La serialización es el proceso de convertir una estructura de datos u objeto en una secuencia de bits para que pueda almacenarse en un archivo o memoria intermedia, o transmitirse a través de un enlace de conexión de red para su posterior reconstrucción en el mismo entorno informático o en otro.

Diseñar un algoritmo para serializar y deserializar un árbol de búsqueda binario. No existen restricciones sobre cómo funciona el algoritmo de serialización/deserialización. Solo necesita asegurarse de que el árbol de búsqueda binario se pueda serializar en una cadena y que la cadena se pueda deserializar en el árbol de búsqueda binario original.

La cadena codificada debe ser lo más compacta posible.

Idea : Dado un árbol binario, el "recorrido en orden previo" y el "recorrido en orden" pueden restaurar el árbol binario. Dado un árbol binario, el "recorrido posterior al orden" y el "recorrido en orden" también pueden restaurar el árbol binario. Para los árboles de búsqueda binarios, dado el "recorrido de preorden" o el "recorrido de posorden", se puede obtener el "recorrido de orden" clasificándolos. Por lo tanto, los requisitos de serialización y deserialización se pueden lograr realizando únicamente un "recorrido de preorden" o "recorrido de postorden" en el árbol de búsqueda binaria. Este problema se resuelve utilizando el método de "recorrido posterior al pedido".

Al serializar, solo necesita realizar un recorrido posterior al orden del árbol de búsqueda binario y luego codificar la matriz en una cadena.

Al deserializar, la cadena debe decodificarse en una matriz para el recorrido posterior al pedido. Al restaurar la matriz atravesada en orden posterior en un árbol de búsqueda binaria, no es necesario ordenar la matriz atravesada en orden y luego restaurar el árbol binario en función de las matrices atravesadas en orden y orden posterior. la matriz se puede recorrer directamente en orden posterior según el orden Una matriz de árboles de búsqueda binarios restaurados. En la matriz obtenida mediante recorrido posterior al orden, el valor del nodo raíz está al final de la matriz, los nodos del subárbol izquierdo son todos más pequeños que el valor del nodo raíz y los nodos del subárbol derecho son todos mayor que el valor del nodo raíz. Se puede diseñar una función recursiva basada en estas propiedades para restaurar el segundo árbol de búsqueda de Fork.

El código de implementación JS específico es el siguiente:

var serialize = function(root) {
    const list = [];

    const postOrder = (root, list) => {
        if (!root) {
            return;
        }
        postOrder(root.left, list);
        postOrder(root.right, list);
        list.push(root.val);
    }

    postOrder(root, list);
    const str = list.join(',');
    return str;
};

var deserialize = function(data) {
    if (data.length === 0) {
        return null;
    }
    let arr = data.split(',');
    const length = arr.length;
    const stack = [];
    for (let i = 0; i < length; i++) {
        stack.push(parseInt(arr[i]));
    }

    const construct = (lower, upper, stack) => {
        if (stack.length === 0 || stack[stack.length - 1] < lower || stack[stack.length - 1] > upper) {
            return null;
        }
        const val = stack.pop();
        const root = new TreeNode(val);
        root.right = construct(val, upper, stack);
        root.left = construct(lower, val, stack);
        return root;
    }

    return construct(-Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, stack);
};

Análisis de complejidad:

Complejidad del tiempo: O (n) O (n) O (n), donde nnn es el número de nodos en el árbol. serialize\textit{serialize}serialize requiere O(n)O(n)O(n) tiempo para atravesar cada punto. deserialize\textit{deserialize}deserializar requiere O(n)O(n)O(n) tiempo para restaurar cada punto.

Complejidad espacial: O (n) O (n) O (n), donde nnn es el número de nodos en el árbol. serialize\textit{serialize}serialize requiere espacio O(n)O(n)O(n) para guardar el valor de cada punto en una matriz, y la profundidad de recursión más profunda es O(n)O(n)O(n) . deserialize\textit{deserialize}deserializar requiere espacio O(n)O(n)O(n) para guardar el valor de cada punto en una matriz, y la profundidad de recursión más profunda es O(n)O(n)O(n) .

Revisar

Esta semana les comparto un artículo en inglés que estoy aprendiendo sobre blockchain. El artículo trata sobre cómo funciona realmente Bitcoin. El enlace del artículo es Cómo funciona realmente el protocolo Bitcoin – DDI . De aquí en adelante, este artículo profundiza en perspectivas más técnicas para comprender algunas detalles técnicos de Bitcoin, pero aún así comprender el marco del protocolo Bitcoin en su conjunto y estar familiarizado con el paradigma técnico de los proyectos blockchain representados por Bitcoin.

Aquí hay algunos extractos para compartir:

Un problema con la primera versión de Infocoin es que Alice podía seguir enviando a Bob el mismo mensaje firmado una y otra vez. Supongamos que Bob recibe diez copias del mensaje firmado "Yo, Alice, le doy a Bob una infocoin". ¿Eso significa que Alice le envió a Bob diez infocoins diferentes? ¿Se duplicó accidentalmente su mensaje? Quizás estaba tratando de engañar a Bob haciéndole creer que le había dado diez infocoins diferentes, cuando el mensaje solo le demuestra al mundo que tiene la intención de transferir una infocoin.

Lo que nos gustaría es una forma de hacer que las infocoins sean únicas. Necesitan una etiqueta o número de serie. Alice firmaría el mensaje "Yo, Alice, le estoy dando a Bob una infocoin, con el número de serie 8740348". Luego, más tarde, Alice podría firmar el mensaje "Yo, Alice, le estoy dando a Bob una infocoin, con el número de serie 8770431", y Bob (y todos los demás) sabrían que se estaba transfiriendo una infocoin diferente.

Un problema con la primera versión de Infocoin fue que Alice podría seguir enviando el mismo mensaje firmado a Bob. Supongamos que Bob recibe diez piezas de información firmadas "Yo, Alice, le doy a Bob una moneda de información". ¿Significa esto que Alice le envió diez monedas de información diferentes a Bob? ¿Se copió accidentalmente su información? Quizás estaba tratando de engañar a Bob haciéndole creer que le había dado diez infocoins diferentes, y este mensaje solo le demostró al mundo que tenía la intención de transferir una infocoin.

Lo que queremos es una manera de hacer que Infocoin sea único. Requieren una etiqueta o número de serie. Alice firmará el mensaje: "Yo, Alice, le doy a Bob una moneda de información con el número de serie 8740348". Luego, Alice puede firmar el mensaje "Yo, Alice, le doy a Bob una infocoin con el número de serie 8770431" y Bob (y otros) sabrán que se está transfiriendo otra infocoin.

Técnica/Consejos

Esta vez compartiré un punto de conocimiento importante sobre el desarrollo front-end: en el proceso de desarrollo front-end, implica conocimiento relacionado con algoritmos y el uso de puntos de conocimiento codiciosos relacionados con algoritmos. Aquí compartimos un escenario práctico en el desarrollo front-end sobre el mejor momento para comprar y vender acciones. Esta no es una pregunta de algoritmo. De hecho, es un punto de conocimiento que se puede utilizar en el desarrollo front-end. El código de implementación específico es como sigue:

/**
 
* @param {number[]} p 价格
 
* @return {number} r 最优解
 
*/
 
var maxOptimal = function(p) {
 
    var r = 0;
 
    for(var i=1;i<=p.length;i++){
 
        if(p[i]>p[i-1]){
 
            r = p[i] - p[i-1] + r;
 
        }
 
    }
 
    return r;
 
};

Compartir

Esta vez compartiré el tema de si los programadores necesitan estar certificados. Diferentes personas tienen diferentes puntos de vista sobre este tema. Algunas personas piensan que los programadores solo necesitan tener una base de programación sólida, una rica experiencia en proyectos y una actitud de aprendizaje continuo para estar calificados para el trabajo, mientras que otras personas piensan que los programadores necesitan obtener certificados profesionales. ., Solo así podrás demostrar que tienes ciertas habilidades y habilidades profesionales, y también podrás obtener mejores oportunidades laborales y beneficios salariales, y mejorar tu ventaja competitiva.

En situaciones reales, en la mayoría de las empresas, el desarrollo profesional de los programadores debe tener en cuenta muchos factores, como el conocimiento profesional, el nivel de habilidad, la experiencia en proyectos, etc. La certificación es sin duda una forma de medir la profesionalidad de un programador, pero no es la única. Si un programador tiene una rica experiencia en proyectos, excelentes habilidades de programación y aprendizaje continuo de nuevas tecnologías, también puede ser reconocido por la empresa y tener oportunidades de avance profesional.

Por lo tanto, personalmente creo que los programadores pueden optar por la verificación, pero no es una opción necesaria, todo está determinado por su propia situación real.

Conclusión

Al momento de escribir estas líneas, me siento cómodo en la cuarta semana y me he adaptado completamente al modo de aprendizaje de ARTS check-in. En general, uso una semana de tiempo libre para estudiar estas cuatro cosas respectivamente. En general, dedico algo de tiempo cada Día para estudiar estas cuatro cosas respectivamente, luego hay un resumen al final de la semana, este método también es bastante bueno. A partir de la cuarta semana, el mes de aprendizaje de ARTES en el que participé ha llegado a su fin, pero no terminaré con el final de la actividad, seguiré superándome un poquito cada semana de esta manera, manteniendo un estado. de aprendizaje continuo, y dejarme seguir aprendiendo ¡Progreso y crecimiento continuo de manera sutil!

Supongo que te gusta

Origin blog.csdn.net/CC1991_/article/details/133134430
Recomendado
Clasificación