“Server Error” de Youtube

Esto es un error que he recibido desde YouTube. Me ha hecho bastante gracia y he decidido postearlo para compartilo con vosotros. Creo que voy a hacer una categoría llamada geekfail para estas cosas. Jojojo.

500 Internal Server Error

Sorry, something went wrong.

A team of highly trained monkeys has been dispatched to deal with this situation.

If you see them, show them this information:

oS5k8ddl4_mhnwSf3tpqJoNjWFPbPwB1xXHt8_5xSI7Nu6fKv2ghgtVD-rYF
VjiyL6NrcvQclc-0aGySc_Y_OKKClCZ6E-RcXYZBQEBjOYEgaGixOnp19Irc
Cpj-ZURpqed4kysfmU7_5AgFw5-R_Il1g7bNl0di3i7laoE4UgLgoyqyNMZm
iwts6EPlk8FyTqmqKINhH4wHOEvFdJ2U4S_aX_cjpRnpmme1ez3O52VswgO6
HdokcFud9SKKWUQa6Sgqueb99ZnHRSYOqiJ6URp1Sh9HbhYm76B7KHCB90gf
UH6j4sTwaLodfFF6GYEbuyjgtT0aykaAnepdH4liFfRQJAyJw-ETfUp3qSgl
yjUq-LPqFaDZ5sAerdqIRBuDcBWgsHK2blSswoKWDCdzZJ-6WvAs54J4Yw6w
NzJ7Dgip5uy7MWm8vkTWyseDptQXco5W8IDV08xP98oakJ0feHT9fYEwJxE8
3qW-ijnOWebpAMcm5eZNKlmUnm2l5dB6Sw7HkwbmbpuZc6BXn7tS8uzXJBVP
p4EAnfutd4qXz_LEyiXcEXn0R0u2g08ez_wNIPxcyzEWaG3SGl3SpW9ajxQB
tROABWoHBAsSMLnF-SQCRWG-C18kRg-XCuVAitvcLihwBjeOHlkioQ4uXDDJ
-Km6-ExcE9h6d8tjUoS7JFULClYb92kPG6JSuNJ8ZvdUJd-v00p5MOKA78F_
Lz0fD2OfI8c2_qbvdQM6yofJoK6rRQU9_EFGQ7E5Xtjbd9uKw_GcQeDDwzPm
uUaZmIzLi3S2HVVtQQObZnxmn_Pg2zUcn3AEEWs-2OPRnoa6C311o2OID-3J
7yYT_h76AWI02TdH5m1BBqjRiQImAwJ10w04vvrRegZMX7CrmfmzBU7Ax2ZF
s1e36icCyGPE3kBMtnZ3c7N4B0hM2zty9mTMoAQt6mSt4sk3x2pi6ZaBgUnV
v2uL4c-ERAcDRY5A3pGbckbotLKhfnE1Z4-t3t_8E9_kEuex9NC_dVgeMKYB
NKaNnPDpYPwI_PnMV_sZnSZ1jthrjplqBb8xs9KCy7m-Lt7h7UH-NAFPwY9n
KdrXdEnn3MdCkMfoo_FeVMOWuZUMGxqJztzxgp4kfxjMO7eke7CEYxiEiI8t
ew6t4fnX2hdDqaVj-3nyPlJ7JLDqb0Cn6gzff-diBUHcSIcUcR1v5soWSCPO
936_dMBqii3zi_czqFglg0ZNtEo_1_sfF3bI-i2dX1ozyQ8P_hpTArn1xAz8
rK0UUuUnda5RqgLcrPMj5u94BVj3rTGEsM-GawqjdS2DpQknEbKgcLbTHoTq
LPQkwFWKaEkNThYUo2kHbVtHKmmNqIWkFo7VAQfoGZXwGyxx9M-7pQuza7OR
UJOqFNcNykk6gJaFk7U601kgG6W7t_eg1uOCks4rKaEgv0h6ZL6KMDIvOnAe
USh3TzZXHlUbMAQRPBdIAAigZspRR6UW0H5zOnNCl3Kjp7y1X_oDSiEiP8-T
epiNn2wFDf6BKkdpQVm_tTeyrDsCVeK-cac6OVg19HXSA6YaGFQhW0ghJaLH
4SGs6HkMZxqH6d2CGJLXJc-8XfyplJ6xH4HC7b3UdshPj1XoLCepNrdfP22f
Cm06dXfvfRHOHMvCww56qOcENgrDPkSMRpIN36KvaXD_i232Jc357zBUsjPA
EzqdsfptTke7s--JORs1me0LtmdfSmNgP2Jv6W0SGxXuf343hw0fwMP6L6W_
oagTJYPrBwOdZ93ncl8pASJSTmI8dssW_U87M9Zx-6SFzuQdCdqEoqhtcxNy
EHfzb53Fec8jrfIeAUUVNK0ZBzJpBVHIF_VWGeRZv_U7VyRHLUi7fYZVqRjs
lYl6c6EuLNNt2L4NS1zrCqHckH9amNSJBS8-2bSYSxoVhXn36fPVJq3oRKHy
DKpIzu3GfeVhuIdpqwQZKo3KmbuozfXQbxkQJjWsoaeUxab_GiRyICumXJ35
xNw1QsAUZ_XKfRJgHdij44Bdi3GXx5xRk3oshw4AiEm0BBprl3yxBZ1HaTX6
IgppcYCeaKjmUpk47tpRDMlLH068gvMwwnr6lkHuXnykXxgFiKyfc-VZeiIe
Lsrgetwpq-Uc5uvMDAEdOeqYg6AYMEfiU_Or22MmqDCUxiz6x42evNQKjDPf
yLXnbXKOLttDWpDN-9oXXm41MjrLUDeB0QvJPKImlO5szdQjzi_GgDc9qM3G
e62uVZRZvRD8awL2h7U8Oe6cGycD-hsBNRaE5BttTy2JaKvOqsSvmsUgxW_k
-3XLwqWbQOQUFqwES3VloYswjZebgBc_pLM0dUjUUMau8F7JNf2XK2_wIxFJ
1gRPjBValiXPTLaBdCs-gOqn9_nNhrwH1LfNsUBHD3EZEqzebpt4ZI5E2sIH
1tH_LUcuXFkt_xpSJfYs2CpVAtZesVMScowkTawiDpHYOWPutLhyoO98DIk5
CD7P2gLir2gUkPoRkbjj-i8sSHD0dNoJMAb1Co4AYobA0t0c25N1F819K5ou
7tdnuSxoq3MTdwbJWJeO9bwPpp_weyzOyi-6TLO0dKF2VL2eRI_AERmg6Tjd
MXVdzL_Ri9O71bBxEH6eZmH0bT1BKS_guMNdGSRuX5ZjMbqL0gnmXkrrCxTj
bm7A-mjSOHKl6fVudDYXpIhg2Nd_endbSpoUfLmASxaZYgVVKDojrbu4RsgW
yvu4tkeLSFQdy3ertiGevJQ7Ra61RStmAhXcl0Q_MgqcMxHu-hXyEFFFv5J0
hSAAH5XhkqQA9eHHQiCU6ZaEY50v3fkAYG2d9064ITv_nRtEVequk2SPnrWl
x2TrYjpr7IbmPHaBa5yIxnqL-fj_6a7lAd1Ekb2v104GQfXHwmHrEEeLSq6m
OvENOAg5N28ArKV0Qc969MFkfnsiwH389dl0P-EBdjlAXeItIQJFe0c3rkEF
bAGm193TgfJUCUjEVFGffBHe77B0IBNcodBAtO6M2A8Xit4oWVBUFrLCsTdx
2G7CXOkW-0uFfV1LSznF2KuQegYRDqvHpw3CiHIYb3qqtDzp_iWTp32rE-F4
moiFgFK0PPmMGY6XnH5eLvOhhZBLEwPsdcNN1fP1r7MMmyNBNQGOQ-EQ8gLZ
ehTNkYfnWuiwciLHksVNXybnu7snOBnKy_jQ9k8QW_QkKeUn7mZCPQwDAMlo
t_LBgbuDNmnv8dnIR5Qn1XFAkTJOR8iKCAT2uI3HT9XBDfJy1NGPjbixYOB6
x6OGFCGZsOdxrUCuTey9XUjf1n6oQuQE7XSMKxL6stFCF9VUPh19Pe0T7lT0
79PWoQzgioRDPumuhWxMsnVc3tSyV9J_AinWyGdDB3zJ5y_MIePDXg_ZaMrE
OKDK7GM1cYrgyqdcxovDXjP8Hylyiw5aWZVotYGpbtqcmkTh8oInLID9FQhu
qnKO6rjUamuMZEQEOz98oMx9iZv_RAJNgUgPD5IC3Be2EOE_CdbxVdGiv1FZ
TNyDyNBbIrNgbSi9KwvzOiyHd1GenBNuhkieumPqGYLaCXkO6lmb7sRFQx1d
Zx0bPq1rGznY_jjUeeUDI_ZZqX5ZqYK8m1mgkmYVPE-PeJOAqIXfDH5Qfe5e
ukbvimtGRffHBQUJnQ0LKcEm74cLwJmnU-1ACkSNveYaqNnC2W807YMy8Axo
5vR9hI3OyOnK4TYdoPfn3o_T2yPebyKuyrAR0fmwrtMVixfVXxhNcAE0anx2
jxhofzFK_agCWajED9BjCEXuLRPENcVAfuHCiAQry9RbnkjoEuRkDVz6I0kz
hEj8UkTuw7USDBGIyff_KmyZ0TrgxC6uJ8t1W5-PH0RLTwyoIQyjppPKy0uf
aw-eFfBzJGIyj9r2V0TL7EPgvMczIvbU4d8j0FyfrWsk9DG95HpdAOwgVoCf
VT7l8kwBzGSMlD4161w95ijTFA_oNowh8i2rPuSYk37Zme7VYlzKuFHP5PF4
VnEjw1QbMxkk22BE9WeMc_G7RSk4qkyi9LOCG_b9Zi1vcwoWCBDpIxiypbkK
BONDYhqPew8cwOKBIHXu_JL2c_xj5kDRg2xl0cv2_rySScE50XJ1dlU_7pha
MHrbr02MnT4_Bc9X9-9H6-5i9_pJzmGb8Q6MQTJBM5aiXTBlN07bVxJbZeBS
5UQxQrI5OQxmo-3ajg98qkG61fGzKh2l7Y6s_eGNrCgiXlLJPh_ZtxBPjipo
Z0lc3P4ChuuECqxCb9RwhNhmcMzIip2ttIbTHN-3gP8OlbonqDCEkQU5LqCf
PuoeZ7FKpKOGLotuBttyGEgll-SNB97murpo8Mmx9endQHHRJGTPuyLBl_iZ
8N4iWXGNLImMJaDBscLLuxtt0i7QvC5rwq2IZbNTNXDCeYu1yNvdcMVaba0e
9sZN9Fm3Fi2EW7PWEejAz-XdjIQWh2ufxwf-BoEdofL5C5MixNNhTQjiF7_0
s9qqDhJwrkvFtKT05QzAKzF43wOV81t0Um5Akra6eECxRqMUOH1BsB4HJzQ2
ZFgMNlhkZmNyhTfwmj5o3CDeVVJnttd1MvlnNnLdZuvM1K6wcfwg0xshQwOt
wYAngs9J3VTlVJR4AT4kFr7iM-AxMQwQyDnuQq2h_jzsUxbvrv704yrfzMUz
JrT5EJZgE_-dcISs-A9hKVs_RX2eCVYpltBxj3BgKR_PH9zZ7rB9Of6IhVT6
HekYWNSMi_AQIYtyvOEdi7W2M2cBmC1GhuZ6oZCCPqYizeuk9hPgQWo3dJKV
E4hR5s9s1dPMAj_u2wDSbNs9SGEjB9ALEfY0aRAfJ449BTw55nIdTYpWwd8F
Y-6GLJY5dT5AaDPV-X3JKT6JanvgPSNp5xebjwi_hH9fo9_JmgdUIKjZ7l9T
Px8p6P19WT7cKzN64xeYWKS2qwvnM7hxbuxW31Sttp0yed1X6yHaRBmw4JQ5
45sPARx9

ETA: fin del “conflicto armado”

Yo no suelo opinar de política en medios como este que va a leer mucha gente. Porque me considero un ignorante de cuidado.

Por supuesto, me alegro del “cese del conflicto armado” pero a qué precio, me pregunto yo. Algo tendré que decir dado que tengo mi propia opinión. Y esto es lo único que diré:

Espero que no afecte a las elecciones. Espero que la gente indiferente no piense “¡anda!, pues esta clase política no será tan mala después de todo”. Porque lo es.

De todas formas, las posibilidades de una reestructuración importante del gobierno han pasado de bajas a escasas.

Eso es todo.

BOLA EXTRA: ver el comunicado de ETA me ha puesto nervioso (estrictamente, casi me hace hervir la sangre), pero claro, qué van a decir, no van a soltar “lo sentimos mucho, somos unos asesinos y los nuestros están bien entre rejas, ¡colgadnos!”. Esto es propaganda. Espero que la estrategia de nuestros políticos esté a la altura de las futuras negociaciones y, por lo que más respeten, espero que se les siga dando caña.

La línea más larga que he visto en mi vida

¿Os acordais de cuándo comentaba se era ético / profesional modificar el código de otros?

Bien, y si me encuentro algo como esto:

                            var newLine = $("<div>").addClass("menuWindow").html('<ul id="topWindowMenu">' + addLi('search' + incidenceId, 'Search', 'opMenuWindow search') + addLi('mine' + incidenceId, 'Assign to me', 'opMenuWindow mine')  +  addLi('delegate' + incidenceId, 'Delegate', 'opMenuWindow delegate') + addLi('transfer' + incidenceId, 'Transfer', 'opMenuWindow transfer') + addLi('task' + incidenceId, 'Task', 'opMenuWindow tasks') + addLi('print_incidence' + incidenceId, 'Print', 'opMenuWindow print') + addLi('save_incidence' + incidenceId, 'Save', 'opMenuWindow save') + addLi('refresh' + incidenceId, 'Refresh', 'opMenuWindow refresh') + '</ul>');

¿Ahora qué hago? Son 664 caracteres. Más de 8 folios, uno al lado del otro.

EDIT: Una apreciación paterna. De 664 caracteres, los 7 primeros son tabuladores destinados a mejorar la claridad del código. Es decir, el 1.05% de la línea está destinada a mejorar la legibilidad.

Diferencias entre null y undefined en Javascript

¡Uy! Cuánto tiempo sin pasar por aquí…

Resulta que últimamente, en el trabajo, dedico mucho tiempo a Javascript. Es un lenguaje que cada vez me gusta más: flexible, simple y ortogonal. Es increíble a dónde se llega con 4 reglas bien aplicadas. Eso sí, se enseña MUY mal. Por ello, recomiendo encarecidamente leer la (re)introducción a Javascript por parte de Mozilla:

(…) Javascript probablemente sea el lengauje más incomprendido del mundo.

Volviendo al tema de este post, en Javascript hay dos “valores” especiales: null y undefined. ¿Pero qué significan exactamente y cuándo usar uno u otro? La mejor respuesta la he encontrado en StackOverflow. Traduzco la parte más divertida:

(nombre es undefined)

Programador: ¿qué es nombre?
Javascript: ¿nombre? ¿qué es un  nombre? No sé de qué hablas, ni siquiera has mencionado nombre antes. ¿No te referirás a otro lenguaje?

(nombre = null)

Programador: ¿qué es nombre?
Javascript: no lo sé

(…)

La clave para entender la diferencia radica en la noción de existencia. Si una variable es:

  • undefined: para Javascript, no existe. O bien no ha sido declarada o jamás se le asignó un valor.
  • null: para Javascript, la variable existe. En algún momento, explícitamente, la variable se estableció a null.

Las principales confusiones vienen de que, en Javascript, las expresión:

undefined == null

es verdadera por efecto del “type coercion” (otro día hablamos más de ello).

No obstante os recuerdo que el operador == no funciona en JS cómo están acostumbrados la mayoría de los programadores. El operador de comparación al uso en JS es === y la expresión:

undefined === null

es falsa como cabía esperar.

Así que, a la hora de usar uno u otro debemos ver si estamos preguntando por la existencia de una variable. Si es el caso, usaremos undefined. En caso de que preguntemos por si la variable contiene un valor seguro o no, como ocurriría en Java, C++ o C# usaremos null.

jsperf: aplicación web para comprobar el rendimiento de Javascript

Me gustaría enseñaros una utilísima herramienta que he encontrado por la Red. Se trata de http://jsperf.com que resulta ser una web para medir el rendimiento de fragmentos de código Javascript. Lo mejor es que permite incluir librerías externas tales como jQuery o Protoype por lo que podemos crear test para poner a prueba estos frameworks. Yo he creado este test que comparto con vosotros y que compara distintas técnicas de crear elementos HTML y añadirlos a un documento:

http://jsperf.com/jquery-dom-creation-techniques

Su ventana de resultados no sólo muestra la mejor y peor ejecución sino una muestra de la desviación típica y una comparativa entre los distintos fragmentos. Además, antes de publicar un test, si nuestro código lanza excepciones, se nos avisará convenientemente. El único fallo que le he visto es que si nuestro código no es gramaticalmente correcto, la página de testing se cuelga en vez de avisarnos. Pero bueno, siempre podemos usar Firebug.

¡No dejeis de echarle un vistazo!

Del amor propio a la obsesión por lo que es mío

El viernes tuve un día realmente malo en el trabajo pero creo haberlo resuelto correctamente. El caso es que aun hoy sigo dándole vueltas a lo acontecido y reflexiono sobre lo que pasó.

Resulta que el viernes a última hora, un compañero de trabajo y yo modificábamos el mismo archivo pero realizando tareas completamente distintas. Mientra él ajustaba ciertos detalles de apariencia, yo trataba de mejorar algunos aspectos del comportamiento. Mi compañero tiene la costumbre (para mí, arriesgada) de realizar un sólo envío (al finalizar la jornada) al repositorio de versiones mientras que yo suelo subir versiones estables cada menos tiempo (un par de horas o así). El caso que a eso de las 12.00h del viernes mi jefe nos pide mezclar los archivos. Para ello primero subiría los cambios mi compañero y luego yo.

Cual es mi sorpresa cuando mi compañero, abrumado y enfurecido, me pregunta que por qué he subido yo primero y me acusa de haber realizado un montón de cambios. A esto le sigue una sucesión de frases que, sin faltar al respeto en ningún momento, me tachan de soberbio, afirmando que sólo tolero el código que yo creo, que “lo de los demás no vale” y que “por eso tengo encontronazos con todo el mundo” amén de que tengo la mala costumbre de pisar el trabajo de los demás*.

(*) Este asterisco viene de una vez en la que sí metí la pata y me cargué sus cambios al desestimar un conflicto. Volver a una versión anterior y resolver la mezcla me llevó 10 minutos. Es lo bueno de los repositorios de versiones, nada se pierde.

Mi respuesta es invitarlo a comprobar que no he realizado ningún cambio reciente, que el último es de las 10.00h de la mañana y que mi trabajo también incluye la modificación de esos archivos. También le propongo mezclar yo los archivos dado que estimo que no me llevará más de 15 minutos pero él insiste en que ha cambiado demasiado y que la mezcla llevará al menos una hora. Trato de que considere que tales cambios sólo son producto de que mi editor de texto ha reemplazado los tabuladores por espacios y que por eso parece mucho más de lo que hay…

En este momento llegan mis jefes que preguntan que qué pasa. Mi compañero insiste en que he realizado un montón de cambios, que subí los cambios si cerciorame de que nadie estuviera tocando el archivo y que la mezcla durará una hora. De nuevo indico mi intención de asumir la responsabilidad y de mezclar yo dado que reconozco que no pregunté si alguien estaba usando el archivo porque, para mí, el proceso de mezcla es parte del ciclo de desarrollo. Finalmente tomo la siguiente decisión: que se desestimen mis cambios y se reemplace mi versión por la suya. Una vez hecho esto afirmo que podré reconstruir los cambios en unos 15 minutos que es lo que me llevará mezclar el código con mi versión local.

Primeramente indico al visor de diferencias que no tenga en cuenta los espacios en blanco lo que convierte los dos grandes bloques de modificaciones en algunas líneas sueltas. A continuación resuelvo la mezcla en 20 minutos. Ni más ni menos. Compruebo que mis cambios en ese archivo a penas llegan al 10% de los totales. Pero la verdad, esto ya lo sabía.

Leer más

Mi segunda entrevista con Google

Bueno, antes de nada decir que no la he pasado, pero que no hay nada que lamentar. Estoy trabajando en Telefónica I+D desde hace tres semanas y me gusta mucho el puesto en el que estoy (sólo tengo que conseguir que me contraten ellos y no andar de subcontratado, jejeje).

Esta vez fueron otros 45 minutos; me puse muy nervioso y me trababa cada dos por tres. Es lo más negativo que observé de mi actuación: que me faltaban las palabras. De nuevo se dividió en dos partes: durante la primera tuve que describir mis experiencias trabajando y durante la segunda hacer algo de programación y analizar mis propios algoritmos. Salí muy convencido de que esta parte la había hecho bien pero, mira tú por dónde, hoy mismo me di cuenta de que hubo un par de problemas en mis respuestas.

En fin, espero que mis errores ayuden a otros. Vamos con el contenido de la entrevista.

Leer más

Pretty-Print: Imprimiento de forma “bonita” datos complejos en python

Hoy en el trabajo, tenía que cargar a mano un diccionario de Python que, en su forma canónica, ocupaba un churro de 7000 caracteres, que se dice pronto.

Buscando cosas que no tenían nada que ver, descubro el módulo pprint que seguro que, a la hora de depurar, os resuelve la vida a más de uno. Se trata de un módulo que aúna funcionalidad para representar tipos de datos arbitrariamente complejos de manera “bonita” (el módulo se llama pretty-print).

La funcionalidad más básica la proporciona la función pprint() del módulo. La función toma los siguientes parámetros:

  • object, el objeto que quieres imprimir.
  • stream, opcional, dónde lo quieres imprimir. Por defecto en la salida estándar.
  • indent, opcional, cuántas sangrías (indentaciones) por nivel. Por defecto 1.
  • depth, opcional, nivel máximo a partir del cual los objetos más profundos se reemplazan por ‘…’. Por defecto, desactivado.
  • width, opcional, anchura máxima antes de romper una línea. Por defecto 80.

Os dejo una comparación para que veais a qué me refiero:

import pprint

a = {'nombre completo':{'nombre':'Salvador', 'apellidos':'de la Puente'}, 'edad':25, 'puestos':[('programador .NET',2006),('administrador de sistemas', 2008),('investigador', 2010)]}
print a
pprint.pprint(a)

Y su salida:

>>> print a
{'edad': 25, 'nombre completo': {'apellidos': 'de la Puente', 'nombre': 'Salvador'}, 'puestos': [('programador .NET', 2006), ('administrador de sistemas', 2008), ('investigador', 2010)]}
>>> pprint.pprint(a)
{'edad': 25,
 'nombre completo': {'apellidos': 'de la Puente', 'nombre': 'Salvador'},
 'puestos': [('programador .NET', 2006),
             ('administrador de sistemas', 2008),
             ('investigador', 2010)]}

¿Veis qué útil?

Mi primera entrevista con Google

Bueno, el pasado Jueves pasé mi primera entrevista con Google y el Viernes me dijeron que la había hecho satisfactoriamente y que a la semana siguiente me pasarían otra. ¡Algo es algo!

Fueron unos 45-50min de entrevista en Inglés con uno de los ingenieros de Google. Para mi el tiempo se me hizo eterno y entre los nervios, el calor, el teléfono y mi dicción inglesa, me dio la impresión de que lo había hecho fatal aunque reconocía que era fácil. De hecho la sensación era “avergonzado de lo mal que lo había hecho para lo fácil que era”. Afortunadamente no fue así.

La entrevista se dividión en tres partes: una parte de teoría y dos problemas. Aunque me habían pedido Java o C++, me pude defender perfectamente en Python y a continuación os cuento un poco la entrevista, cómo respondí y cómo me hubiera gustado responder…

Leer más

Hash tables, diccionarios o la memoria del futuro

El ordenador, siguiendo el modelo actual, posee una memoria dividida en celdas que puede referenciarse palabra a palabra para obtener contenido de manera inmediata.  Los ingenieros decimos que el acceso a una celda de memoria tiene coste en O(1) o constante. No hay que buscar nada tan sólo pedir lo que haya en la celda número 42 y ¡presto! ahí está.

Este esquema de memoria es muy versátil porque representa listas de elementos. Casi cualquier estructura de datos puede representarse en una lista y, utilizando punteros, las listas no tienen por qué ser homogeneas. Podemos guardar en ellas de todo e identificar cada objeto guardado por el índice dentro de la lista. En otras palabras, por su posición.

Traducir una lista de objetos a un segmento de la memoria es tan simple como conocer el número de elementos, el tamaño de los mismos y la posición del primero.

Sobra decir que al concepto de lista está unido, muy fuertemente, el concepto de orden y posición.

Si hablamos de colecciones de elementos sin orden, como por ejemplo un conjunto, dónde no nos interesa en qué posición está un objeto, tan sólo si está o no está, encontramos que las listas dejan de resolver el problema elegantemente. Sin duda añadir un objeto a una lista es tan sencillo como añadir un nuevo elemento a una lista… ¿o no? Es un conjunto y en los conjuntos, formalmente descritos, no hay dos elementos iguales por lo que nos convendría no tener repeticiones. Así que antes de insertar un objeto habrá que buscarlo en la lista lo que en el mejor de los casos, tiene una complejidad de O(log n) y en el caso medio, de O(n). En palabras sencillas, buscar es una tarea sencilla pero cara en colecciones muy grandes.

Además, encontrar un objeto del conjunto, al no tener un orden predeterminado (nadie nos asegura que siempre metamos A primero, B segundo,  C tercero…), requiere una búsqueda también. Y eliminarlo, por definición requiere primero encontrarlo, así que tres cuartos de lo mismo.

Con esto en mente, un pedazo de ingeniero eléctrico, Dudley Allen Buck, describió un nuevo tipo de memoria llamada asociativa o direccionada por contenido. Esta memoria toma un objeto entero y lo busca en su interior pero esta búsqueda está hecha de tal forma que el acceso sigue siendo constante. ¿Magia? Nop, ¡ingenio!

Leer más

Seguir

Get every new post delivered to your Inbox.