Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Rellenar un array con palabras repetidas
#1

Buenas!.

Después de ver un ejemplo con Python, busqué algún método para rellanar un array con palabras repetidas.
Encontré el método "Fill", pero este método necesita que el array tenga dimensiones.

No puedes hacer algo como:

GAMBAS
  1. Dim dulces as new String[]
  2.  
  3. dulces.fill("galletas",comienza desde aquí, rellena n veces el array con la palabra "galletas")
  4. 'O también
  5. dulces.fill("galletas", rellena n veces el array con la palabra "galletas")



Y estuve probando distintas maneras de hacerlo. A ver si ustedes conocen una forma mejor que las de abajo.
Hice un test a ver cual era la más rápida.

GAMBAS
  1. Public Sub Main()
  2.  
  3.  
  4.   TestBenchMark("LlenarArray")
  5.   TestBenchMark("LlenarArray2")
  6.   TestBenchMark("LlenarArray3")
  7.  
  8.  
  9. Public Sub TestBenchMark(nombrefuncion As String)
  10.  
  11.   Dim i, t As Float
  12.   Dim afinal As String[]
  13.   Dim ob As Object
  14.   Dim palabras As String[] = ["galletas", "merenges"]
  15.   Dim palabra As String
  16.   Dim veces As Integer
  17.  
  18.   ob = Me
  19.  
  20.   t = Timer
  21.   afinal = New String[]  
  22.   For i = 1 To 10 ^ 6     
  23.     palabra = palabras[Rand(0, palabras.Max)]
  24.     veces = Rand(1, 10)
  25.     If nombrefuncion <> "LlenarArray2" Then
  26.       afinal = Object.Call(ob, nombrefuncion, [afinal, palabra, veces])    
  27.     Else
  28.       afinal.Insert(Object.Call(ob, nombrefuncion, [palabra, veces]))
  29.     Endif
  30.   Next
  31.  
  32.   Print "Tiempo para 10^6 repeticiones, método: " & nombrefuncion & " = " & "\t"; Format(Timer - t, "0.######") & "s"
  33.     
  34.  
  35.  
  36. Public Function LlenarArray(apalabras As String[], palabra As String, veces As Integer) As String[]
  37.  
  38.   Dim cadenaconrepeticiones As String
  39.  
  40.   cadenaconrepeticiones = String(veces, palabra & " ")
  41.   apalabras.Insert(Split(cadenaconrepeticiones, " ", "'", True))
  42.  
  43.   Return apalabras
  44.  
  45.  
  46. Public Function LlenarArray2(palabra As String, veces As Integer) As String[]
  47.  
  48.   Dim apalabras As New String[]
  49.  
  50.   apalabras.Resize(veces)
  51.   apalabras.Fill(palabra)
  52.   Return apalabras
  53.  
  54.  
  55. Public Function LlenarArray3(apalabras As String[], palabra As String, veces As Integer) As String[]
  56.  
  57.   If apalabras.Count = 0 Then
  58.     apalabras.Resize(veces)
  59.     apalabras.Fill(palabra)
  60.   Else
  61.     apalabras.Resize(apalabras.Count + veces)
  62.     apalabras.Fill(palabra, apalabras.Count - veces, veces)
  63.  
  64.   Return apalabras
  65.  



La respuesta fue:
 
Cita:Tiempo para 10^6 repeticiones, método: LlenarArray =    1,245407s
Tiempo para 10^6 repeticiones, método: LlenarArray2 =   0,960382s
Tiempo para 10^6 repeticiones, método: LlenarArray3 =   0,80571s


Os adjunto el ejemplo:

Saludos


Archivos adjuntos
.gz LlenadoDeArray-0.0.1.tar.gz Tamaño: 12.34 KB  Descargas: 2

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!
#2

Intenta usar "Push

GAMBAS
  1. Public Sub Form_Open()
  2.  
  3.   Dim sFood As String[] = ["biscuits", "meringues"]
  4.   Dim sArray As New String[]
  5.   Dim dTim As Date = Time(Now)
  6.  
  7.   For iTimes As Integer = 0 To 2
  8.     For iFood As Integer = 0 To sFood.Max
  9.       For iArray As Integer = 0 To 10 ^ 6
  10.         sArray.Push(sFood[iFood])
  11.       Next
  12.     Next
  13.   Next
  14.  
  15.   Print Format(DateDiff(dTim, Time(Now), gb.Millisecond) / 1000, "0.######") & "s"
  16.  
  17.   Stop
  18.  



[Imagen: FillArray.png]
[-] Los siguientes 1 usuarios dice gracias a cogier por este post:
  • Shell
    ¡Gracias!
#3

Gracias Cogier. Genial. Smile

Conocía el método pop, pero no había probado el comando push, que es su inverso.

Saludos

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!
#4

Confused
(11-12-2021, 23:47)Shell escribió:  pero no había probado el comando push

No hay nada especial: ".push ()" es el método ordinario de insertar un valor en un array, aumentando así dinámicamente el número de sus elementos.

"Los horizontes perdidos nunca regresan. " (F. Battiato, La stagione dell'amore, 1983)

"Las ondas nunca regresan. " (Genesis: Ripples - A trick of the tail, 1976)
    ¡Gracias!
#5

(12-12-2021, 00:08)vuott escribió:  No hay nada especial: ".push ()" es el método ordinario de insertar un valor en un array, aumentando así dinámicamente el número de sus elementos.

Cierto. Me temo que es el método equivalente a .add, que he usado siempre. Blush Tongue

El código de Cogier no es exactamente igual a lo que quiero hacer. Pero ha resumido todo el funcionamiento del benchmarh en un solo procedimiento.
Ha usado una nueva forma que usa Gambas en definir la variable de control del bucle. Suelo usar la tradicional. Declaración primero.
Siempre se aprende de los compañeros.

Cogier repite un millón de veces la inserción de la primera palabra del array, luego la segunda y así hasta finalizar.
No es eso, ya que lo que busco es que el número de veces que se va a repetir cada palabra es indeterminado.

Así puede insertarse tres veces la palabra galleta y luego cinco veces la palabra merengue.
Con el benchmark ese proceso se debe repetir un millón de veces.

Usando su código, esto si es lo que quiero:

GAMBAS
  1. Public Sub Main()
  2.  
  3.   Dim sFood As String[] = ["biscuits", "meringues"]
  4.   Dim sArray As New String[]
  5.   Dim dTim As Date = Time(Now)  
  6.  
  7.     
  8.   For iArray As Integer = 0 To 10 ^ 6
  9.     'Se repite n veces la primera palabra, n veces la segunda palabra
  10.     For iTimes As Integer = 0 To Rand(1, 10)
  11.       For iFood As Integer = 0 To sFood.Max
  12.         sArray.Push(sFood[iFood])
  13.       Next
  14.     Next
  15.   Next
  16.  
  17.   Print Format(DateDiff(dTim, Time(Now), gb.Millisecond) / 1000, "0.######") & "s"
  18.  



En un I5-8400 me da este resultado: 1,025s
Es un poco más lento que el método LlenarArray2 y  algo más lento con respecto a LlenarArray3.

Podía ser algo como esto:

GAMBAS
  1. Public Sub LlenarArray4a(palabra As String, veces As Integer) As String[]
  2.  
  3.   Dim apalabras As New String[]
  4.  
  5.   For i As Integer = 0 To veces - 1
  6.       apalabras.add(palabra)
  7.   Next
  8.  
  9.   Return apalabras
  10.  



Y repetir eso un millón de veces. Lo que viene a decir que en vez de usar bucles es mejor usar los métodos que dispone el tipo String[]

Saludos

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)