Cómo separar los apellidos del nombre de pila

Un problema al que nos enfrentamos frecuentemente los programadores cuando lidiamos con bases de datos mal planificadas es que los nombres de las personas se encuentran en un solo campo, por ejemplo "Juan Pérez Gómez".  Esto de por sí es inocuo siempre y cuando el nombre de la persona no se use más que para saludarla cuando habla por teléfono.

Sin embargo, cuando el nombre de la persona es usado de alguna manera para identificarla, por ejemplo en un padrón, lo más conveniente es tener separado el nombre de pila de los apellidos.
Ahora bien, la separación de un nombre de persona en sus componentes es un problema que no tiene una solución perfecta.  Incluso si un humano viera el nombre "Juan Francisco Pérez" no podría determinar si "Francisco" es el apellido paterno o es el segundo nombre de pila (recordemos que algunas personas carecen de apellido materno, y que algunas se apellidan "Francisco"). 

Por otra parte existen nombres y apellidos formados por más de una palabra y hay casos en los que no se puede determinar a qué parte del nombre corresponde cada palabra, por ejemplo en el nombre "María de Jesús De los Montes González" la palabra "de" aparece dos veces: la primera en medio del nombre de pila "María de Jesús" y la segunda al principio del apellido "De los Montes".

Algunas soluciones que circulan por la red intentan utilizar diccionarios de nombres de pila válidos.  Sin embargo debemos recordar que en los nombres propios no existen reglas ortográficas, por lo que "Aarón" sería un nombre tan válido como "Aron".   Lo mismo aplica en el caso de los apellidos: hay quien se apellida "Vázquez" y quien se apellida "Vásquez".

La solución presentada aquí, habida cuenta de las limitaciones anteriores, cuenta con algunas ventajas importantes sobre otras similares que se encuentran en la red:
  1. Muchas implementaciones cometen el error de intentar procesar heurísticamente el nombre de la persona mediante diccionarios de nombres de pila. Este acercamiento tiene la limitación ya expuesta de la inutilidad de las reglas ortográficas en el caso de los nombres de pila. Además, los apellidos tienen un grado de variabilidad menor que los nombres de pila (hay menos personas llamadas "María de Jesús" que aquellas que se apellidan "Hernández") por lo que conviene enfocar el problema empezando por los apellidos y no por los nombres de pila.
  2. Hay algoritmos que recurren a varios ciclos para procesar los nombres. El acercamiento que presentaremos tiene un tiempo de ejecución lineal O(2n). Esto es, los nombres se someten a un solo ciclo, lo que hace que esta solución sea más eficiente que otras que ocupan más ciclos anidados.
  3. Se contepla tanto el caso en el que el nombre completo empieza con el nombre de pila como el caso en el comienza con el apellido paterno. Con la finalidad de procesar siempre apellidos y nunca nombres de pila, en el primer caso el procesamiento se hace en orden inverso.
     Presupuestos y limitaciones

    En el campo de los nombres propios no caben certezas, por lo que tenemos que partir de algunos supuestos razonables:
    1. Esta solución funciona bastante bien en los países de hispanoamérica, donde los apellidos no suelen ser tan complejos como en la madre patria (la culpa de ello la tiene el rebuscamiento nobiliario).
    2. Se asume que cuando un apellido está formado por más de una palabra el apellido inicia con algun palabra especial, por lo general una conjunción. Estas palabras especiales las tenemos en un catálogo fijo. Se continua agregando palabras al apellido hasta la primer palabra no especial, inclusive. Por ejemplo nuestra solución encontraría el apellido "De los Montes" porque tanto "de" como "la" se encuentran en nuestro catálogo. Sin embargo, si alguien se apellidara "Montes del Sur" la solución no separaría el apellido correctamente, a pesar de que "del" también se encuentra en el catálogo. Otro acercamiento posible podría ser que se unieran las dos palabras que limitan a la palabra especial, pero entonces no se separarían correctamente los apellidos del tipo "De los Montes". Suponemos que estos son más frecuentes que los del tipo "Montes del Sur".
    3. Las palabras abreviadas con un punto, por ejemplo "R.", se procesan del mismo modo que las "palabras especiales".
    4. Se asume que el nombre de pila de la persona es lo que queda en la cadena después de procesar los apellidos. Si después de procesar los apellidos no queda nada en la cadena, entonces se asume que la persona carece de apellido materno y que el nombre de pila es el apellido materno procesado.
      Gimme teh codez