[PROGRAMACION] Duda Vectores

Tengo una duda de cómo plantear un algoritmo, sin entrar en lenguajes.

Me encuentro que tengo un vector (a) que contiene por ejemplo años que me interesan tratar.

El año concreto [un elemento del vector (a) ] lo paso a una función.

Esta función devuelve un nuevo vector (b) ya tratado para ese año concreto. Pese a que vaya avanzando en el vector (a) de los distintos años a tratar, me interesa no machacar/actualizar el vector (b), me interesa tener TODOS los vectores (b) tras finalizar el proceso de recorrer el vector (a) que contiene los años y aplicar la función para dicha fecha.

Tras tener los distintos vectores (b) me interesa compararlos con funciones similares a array_diff para poder tener únicamente los elementos que se encuentran en un vector (b) en otro nuevo vector.

No sé si se entiende muy bien lo que quiero hacer, pero me encuentro que pierdo persistencia del vector (b) ya que lo devuelvo, trato o lo consigo por cada elemento que recorro del vector (a).

¿Debería copiarlos en otro vector general? Si hiciera algo así, no veo muy claro cómo podría utilizar funciones tipo array_diff para poder comparar un vector(b) con otros vectores(b) o que fuera demasiado óptimo por lo que tal vez estoy ocupando mucha memoria.

¿Alguna idea / ayuda ?
array_diff entiendo que estás sobre PHP ??
Yo no entendí mucho, pero básicamente veo que incurre mucho en comparaciones entre arrays.

Si especificas un poco mas puedo hacerte algo en .JS que estoy mas puesto, pero básicamente sería varios bucles recorriendo los diferentes arrays en busca de similitudes / diferencias, y a partir de ahí modificar uno de ellos o crear uno nuevo para el propósito. Éste método no sería muy distinto entre lenguajes de programación, o depende de cual sea, puede haber comandos mas escuetos que hagan ésto.

Saludos
alvaro101 escribió:array_diff entiendo que estás sobre PHP ??
Yo no entendí mucho, pero básicamente veo que incurre mucho en comparaciones entre arrays.

Si especificas un poco mas puedo hacerte algo en .JS que estoy mas puesto, pero básicamente sería varios bucles recorriendo los diferentes arrays en busca de similitudes / diferencias, y a partir de ahí modificar uno de ellos o crear uno nuevo para el propósito. Éste método no sería muy distinto entre lenguajes de programación, o depende de cual sea, puede haber comandos mas escuetos que hagan ésto.

Saludos


Simplificando todo un poco:

vectorAnyos // es un vector que contiene anyos, por ejemplo 2019, 2018, 2017
f1($anyo) // función que devuelve un vector con cantidades y descripciones para un determinado anyo que facilito cómo parámetro.No hay descripciones repetidas durante un anyo.

vectorValoresDefault // es un vector que contiene cantidades y descripciones para un determinado anyo; obtenido de f1.
fTratar(vectorValoresDefault) // función que trata el vector y devuelve otro vector únicamente con descripciones.
vectorDescripciones // vector obtenido de la función fTratar que únicamente contiene descripciones.

Los distintos vectorDescripciones serían los que me interesa comparar entre ellos, para saber:

1) Qué descripciones únicamente se encuentran en un determinado vector de una fecha (sólo existirían en 1 fecha).
2) Qué descripciones se encuentran en 1 fecha concreta y en alguna fecha más. (Existiría mínimo en 2 fechas o más).
3) Qué descripciones se encuentran en los vectores, pero NO se encuentra encuentra en la fecha concreta que tomo de referencia.

Pero si el proceso de obtener vectorDescripciones lo hago mientras estoy recorriendo el vectorAnyos, según cómo se hace, no sería capaz de tener al mismo momento distintos vectorDescripciones por todos los anyos que deseo analizar; el problema que veo es que actualizo el vectorDescripciones, cuando no sé si lo correcto sería hacer alguna copia o algo similar.

Una chapuza podría ser, hacer una lista dónde vaya metiendo los distintos valores de los vectores y si se repiten elementos, podría decir que existen en distintos vectores, pero no creo que sea la manera óptima de hacerlo.
Uff me cuesta entenderlo jej. Si me he enterado bien:

- Tienes un array que contiene años.

- La funcion f1 le das un año y retorna cantidades y descripciones en vectorValoresDefault.

- fTratar hace lo mismo que la anterior pero solo con descripciones en vectorDescripciones, que es lo que quieres comparar. Entiendo que las descripciones aquí mostradas son las mismas que las que ofrece la fumcion f1.

Mi preguntas son:
1 año = 1 descripción o varias?
Las comparaciones las quieres hacer entre años? entre descripciones del mismo año? O ambas?
Quieres comparar todo el array de años? O solo los años que le indiques?
Las fechas donde están? Son las cantidades? Múltiples fechas por cada año imagino...

Creo que necesitaría ejemplos de todos esos arrays para comprenderlo completamente. Y luego lo que te decía, ayudarte de varios bucles, sería recorrer cada uno de los arrays que quieras comparar, tantas veces como elementos quieras comparar. O tirar de alguna función ya existente que haga precisamente eso, segín el lenguaje habrá algo.

Crearte uno o varios arrays extra que te sirvan de "caché" para facilitarte las comparaciones, no es nada malo, si lo necesitas tendrás que hacerlo.

Saludos
alvaro101 escribió:Uff me cuesta entenderlo jej. Si me he enterado bien:

- Tienes un array que contiene años.

- La funcion f1 le das un año y retorna cantidades y descripciones en vectorValoresDefault.

- fTratar hace lo mismo que la anterior pero solo con descripciones en vectorDescripciones, que es lo que quieres comparar. Entiendo que las descripciones aquí mostradas son las mismas que las que ofrece la fumcion f1.

Mi preguntas son:
1 año = 1 descripción o varias?
Las comparaciones las quieres hacer entre años? entre descripciones del mismo año? O ambas?
Quieres comparar todo el array de años? O solo los años que le indiques?
Las fechas donde están? Son las cantidades? Múltiples fechas por cada año imagino...

Creo que necesitaría ejemplos de todos esos arrays para comprenderlo completamente. Y luego lo que te decía, ayudarte de varios bucles, sería recorrer cada uno de los arrays que quieras comparar, tantas veces como elementos quieras comparar. O tirar de alguna función ya existente que haga precisamente eso, segín el lenguaje habrá algo.

Crearte uno o varios arrays extra que te sirvan de "caché" para facilitarte las comparaciones, no es nada malo, si lo necesitas tendrás que hacerlo.

Saludos


Gracias por la ayuda, mientras te escribia, he visto cómo podía hacerlo ;)

Las fechas y anyos en este caso es lo mismo, estaba tomando cómo que una fecha será un anyo determinado.

La solución que he usado:
He optado por tener 2 vectores.

Uno formado con el anyo que se desean obtener los datos. El otro vector con el resto de datos del resto de anyos. A este último vector le voy añadiendo elementos a medida que acabo los ciclos por cada anyo.
El resultados es, que tengo lo que buscaba, 2 vectores; el de partida o el que manda; y el otro vector con el resto de descripciones. Así, puedo utilizar las funciones de comparación entre vectores que proporciona el propio lenguaje.

Respondiendo a tus dudas:
1 anyo = un montón de descripciones, pero no se repetiran en un mismo anyo.
las comparaciones las hago por descripciones y anyos.
se compara todo el array de anyos, pero este es generado dinámicamente a partir de un anyo introducido por el usuario, tengo un limite_fijo_hacia_abajo, por ejemplo 2.000 (el usuario nunca puede meter un anyo inferior a este).

Gracias nuevamente.
Newton escribió:
alvaro101 escribió:array_diff entiendo que estás sobre PHP ??
Yo no entendí mucho, pero básicamente veo que incurre mucho en comparaciones entre arrays.

Si especificas un poco mas puedo hacerte algo en .JS que estoy mas puesto, pero básicamente sería varios bucles recorriendo los diferentes arrays en busca de similitudes / diferencias, y a partir de ahí modificar uno de ellos o crear uno nuevo para el propósito. Éste método no sería muy distinto entre lenguajes de programación, o depende de cual sea, puede haber comandos mas escuetos que hagan ésto.

Saludos


Simplificando todo un poco:

vectorAnyos // es un vector que contiene anyos, por ejemplo 2019, 2018, 2017
f1($anyo) // función que devuelve un vector con cantidades y descripciones para un determinado anyo que facilito cómo parámetro.No hay descripciones repetidas durante un anyo.

vectorValoresDefault // es un vector que contiene cantidades y descripciones para un determinado anyo; obtenido de f1.
fTratar(vectorValoresDefault) // función que trata el vector y devuelve otro vector únicamente con descripciones.
vectorDescripciones // vector obtenido de la función fTratar que únicamente contiene descripciones.

Los distintos vectorDescripciones serían los que me interesa comparar entre ellos, para saber:

1) Qué descripciones únicamente se encuentran en un determinado vector de una fecha (sólo existirían en 1 fecha).
2) Qué descripciones se encuentran en 1 fecha concreta y en alguna fecha más. (Existiría mínimo en 2 fechas o más).
3) Qué descripciones se encuentran en los vectores, pero NO se encuentra encuentra en la fecha concreta que tomo de referencia.

Pero si el proceso de obtener vectorDescripciones lo hago mientras estoy recorriendo el vectorAnyos, según cómo se hace, no sería capaz de tener al mismo momento distintos vectorDescripciones por todos los anyos que deseo analizar; el problema que veo es que actualizo el vectorDescripciones, cuando no sé si lo correcto sería hacer alguna copia o algo similar.

Una chapuza podría ser, hacer una lista dónde vaya metiendo los distintos valores de los vectores y si se repiten elementos, podría decir que existen en distintos vectores, pero no creo que sea la manera óptima de hacerlo.


No entiendo nada. De todas formas, y viendo que recurres a usar varios vectores... En cuanto a eficiencia, no es ni de lejos una buena solución. No estás usando una estructura de datos apropiada para este caso. Ponerse a comparar elementos entre varios vectores no es un proceso, por decirlo de algún modo, "eficiente".
dark shadow escribió:No entiendo nada. De todas formas, y viendo que recurres a usar varios vectores... En cuanto a eficiencia, no es ni de lejos una buena solución. No estás usando una estructura de datos apropiada para este caso. Ponerse a comparar elementos entre varios vectores no es un proceso, por decirlo de algún modo, "eficiente".

¿Cúal sería en tu opinión la manera eficiente y qué el código sea legible o mantenible por otras personas a futuro?

El uso de vectores no es un capricho particular, es información que me viene dada de esta manera de consultas a BBDD y desarrollos heredados.

Aún así, soy todo oídos para mejoras y optimizaciones.
A veces resulta "complicado" comunicarse verbalmente acerca de programación, pero creo que ésta se lleva la palma jej. Empezando porque ni se de que lenguaje estamos hablando.. como dije arriba pueden existir funciones mativas del lenguaje que ya hagan eso.

Vector == array ?? Al menos yo lo entendí así.. xD
alvaro101 escribió:A veces resulta "complicado" comunicarse verbalmente acerca de programación, pero creo que ésta se lleva la palma jej. Empezando porque ni se de que lenguaje estamos hablando.. como dije arriba pueden existir funciones mativas del lenguaje que ya hagan eso.

Vector == array ?? Al menos yo lo entendí así.. xD

Más que un lenguaje determinado estaba hablando la manera de plantear el algoritmo. Resulta bastante más educativo saber qué y cómo hacerlo a un nivel superior y después ya te pegarás con los detalles determinados de cada lenguaje. (Al final, pasar de un lenguaje a otro no resulta tan complicado, si tienes claras las ideas de lo que deseas hacer, 'pseudo-código' creo que se le llamaba).


Con vector == array ¿no estarías comparando si 2 vectores son idénticos? Creo que no has entendido lo que preguntaba.

Gracias por la ayuda.

Se puede dar por solucionada la duda, aunque quedo a la espera de las optimizaciones de @dark shadow
Pues eso, sin especificar lenguaje, y sin aprovechar funciones propias de cada uno, sino tirando a lo mas básico, sería recorrer cada array las veces que necesites para comparar.

Con vector == array, me refería a que si cada vez que dices vector, te refieres a un array? jej
alvaro101 escribió:Pues eso, sin especificar lenguaje, y sin aprovechar funciones propias de cada uno, sino tirando a lo mas básico, sería recorrer cada array las veces que necesites para comparar.

Con vector == array, me refería a que si cada vez que dices vector, te refieres a un array? jej

Si para mi un vector, un array o un arreglo es lo mismo ;)
10 respuestas