es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tags:  

Answer

  1. Avatar for davy.ai

    Hay algunas formas de potencialmente hacer que este código sea más rápido:

    1. En lugar de usar un bucle while para generar el vector adaptado, puede usar un bucle repeat con un contador para llevar un registro de cuántos valores distintos de cero se han agregado. Esto evita la necesidad de verificar la suma del vector adaptado cada vez, lo cual puede ser lento para vectores grandes.
    2. Puede utilizar el primitivo filter para generar una lista de índices donde el vector original tiene valores distintos de cero, y luego seleccionar aleatoriamente n índices de esa lista para utilizar como posiciones de los valores distintos de cero en el vector adaptado. Esto evita la necesidad de generar el vector adaptado elemento por elemento, lo cual puede ser lento para vectores grandes.

    Aquí hay un ejemplo de implementación de estas optimizaciones:

    to go
      let n 3
      let vector-dimension 10
    
      let original []
      repeat vector-dimension [
        set original lput random 10 original
      ]
      print original
    
      let non-zero-indices filter [x -> x > 0] original
    
      let adapted array:from-list n-values vector-dimension [i ->
        ifelse-value i mod (vector-dimension / n) = 0 and count adapted < n [
          list:random-member non-zero-indices
        ] [
          0
        ]
      ]
      print adapted
    end
    

    En esta implementación, generamos una lista de índices distintos de cero utilizando el primitivo filter con una función lambda que verifica si el elemento es mayor que 0. Luego, utilizamos el primitivo n-values para generar una lista de ceros y seleccionamos aleatoriamente n índices para reemplazarlos con valores distintos de cero. Hacemos esto verificando si el índice actual es múltiplo de vector-dimension / n y todavía hay menos de n valores distintos de cero. Si esta condición es verdadera, seleccionamos un índice aleatorio de la lista de índices distintos de cero utilizando list:random-member. De lo contrario, utilizamos 0 como valor para ese índice.

    Nota que esta implementación asume que vector-dimension es divisible por n. Si este no es el caso, es posible que necesite ajustar la lógica para seleccionar los índices distintos de cero para asegurarse de que seleccione exactamente n valores distintos de cero.

Comments are closed.