elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  AYUDA CON Inversiones de 1
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA CON Inversiones de 1  (Leído 5,462 veces)
Pitagoras

Desconectado Desconectado

Mensajes: 29


Ver Perfil
AYUDA CON Inversiones de 1
« en: 27 Abril 2022, 18:41 pm »

Buenas, he hecho el codigo en java pero no se como modificar el codigo para que haga las inversiones de 1. Se trata de un codigo divide y venceras donde se me proporciona un .txt  o un .dat con un conjunto de numeros de entre los cuales se proporciona el numero uno y aparece en la lista de numeros una sola vez. Y tengo que hallar las inversiones de 1, sé que el resultado correcto que me debe de dar la modificacion es de: 545
A continuacion el fichero de inversiones de uno y el codigo


Código:
package default_package;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

/**
 * The Class Inversiones.
 * Clase que calcula el número de inversiones que hay en un array para ordenarlo
 *
 * @author Pitagoras
 * @version 20.03.2022
 */
public class Inversiones {

/**
* The main method.
*
* @param args the arguments
* @throws IOException Signals that an I/O exception has occurred.
*/
public static void main(String[] args) throws IOException {
Scanner leer = new Scanner(new File("C:\\Ruta\\InversionsTest.dat"));
int nCases = leer.nextInt();

double a[] = new double[nCases];
for(int i=0; i<nCases; i++) {
a[i]= leer.nextInt();
}

System.out.println("El número de inversiones que tiene el array dado es: " +ordenar(a, 0, a.length-1));
}
/**
* Merge. Método valido para ordenar el array.
*
* @param a2 array que queremos ordenar
* @param a numero de la izquierda
* @param middle la mitad entre el límite inferior y superior
* @param b numero de la derecha
* @return el número de inversiones que hay durante el recorrido del método
*/
private static int merge (double[] a2, int a, int middle, int b) {
int cont=0;
int i=0, j=0, k=a;

double[] left = Arrays.copyOfRange(a2, a, middle+1);
double [] right = Arrays.copyOfRange(a2, middle+1, b+1);

while(i<left.length && j<right.length) {
if(left[i] <= right[j]) {
a2[k++]=left[i++];
}else {
a2[k++]=right[j++];
cont += (middle+1)-(a+i);
}
}

while(i<left.length) {
a2[k++] = left[i++];
}
    while (j < right.length) {
        a2[k++] = right[j++];
}
return cont;
}

/**
* Método para ordenar el array, recursivo. Parecido a MergeSort.
*
* @param a2 array a ordenar
* @param min, limite inferior del array que queremos ordenar - referido a posiciones dentro del array
* @param max, limite superior del array que queremos ordenar - referido a posiciones dentro del array
* @return numero de inversiones necesarias para ordenar el array
*/
private static int ordenar(double[] a2, int min, int max) {
int cont=0;
int middle = (min+max)/2;
if(min<max) {
cont = ordenar (a2, min, middle);
cont = cont + ordenar (a2, middle + 1, max);
cont = cont + merge (a2, min, middle, max);
}
return cont;
}


}




ES LO UNICO QUE ME FALTA PARA TERMINARLO, PORFAVOR SI ALGUIEN ME PUDIESE AYUDAR

.txt de las inversiones de uno:
    1000
    54044
    14108
    79294
    29649
    25260
    60660
    2995
    53777
    49689
    9083
    16122
    90436
    4615
    40660
    25675
    58943
    92904
    9900
    95588
    46120
    29390
    91323
    85363
    45738
    80717
    57415
    7637
    8540
    6336
    45434
    65895
    61811
    8959
    9139
    31027
    87662
    2484
    65550
    23260
    15616
    3490
    49568
    5979
    44737
    52808
    72122
    37957
    34826
    21419
    73531
    94323
    52910
    84496
    71799
    50162
    1692
    1565
    59279
    56864
    20141
    13893
    63942
    6055
    33424
    44771
    25678
    33639
    27793
    41268
    1857
    63388
    32976
    46195
    61291
    61740
    61680
    45264
    76361
    49243
    73250
    67432
    29124
    15198
    30626
    18950
    13857
    32569
    45179
    47696
    21283
    77169
    26357
    97885
    54741
    57246
    61929
    25997
    45859
    3353
    32204
    97451
    60550
    49516
    38558
    57674
    36443
    666
    32486
    54910
    24666
    45119
    40779
    3441
    83779
    60645
    63003
    59616
    7364
    69058
    41651
    12201
    13234
    19717
    11536
    70350
    15611
    74484
    96153
    4127
    60035
    19418
    58613
    28590
    32917
    97780
    17644
    15836
    88046
    26489
    38410
    54618
    16967
    81604
    60064
    5833
    80689
    43137
    57274
    8002
    4445
    42933
    75378
    15130
    10689
    98579
    42780
    38379
    76394
    66337
    15126
    59535
    53639
    43182
    88220
    5506
    21939
    26719
    32919
    78383
    62297
    30677
    15301
    35277
    2240
    37292
    11269
    92554
    12813
    63131
    25964
    15618
    11318
    72799
    43976
    4698
    32984
    5
    56322
    30793
    46586
    36082
    25956
    61243
    44613
    59907
    13187
    43815
    52408
    63547
    86233
    7901
    50572
    29212
    10912
    54449
    373
    69509
    3580
    31479
    66601
    35427
    49309
    50428
    76859
    19840
    95749
    76993
    45747
    67663
    85229
    26778
    72164
    73627
    31869
    22208
    17759
    29409
    20625
    27533
    3911
    28506
    13185
    72229
    2975
    96029
    66725
    67778
    77399
    90300
    16005
    39433
    33342
    98536
    66330
    41629
    79932
    64508
    80437
    58093
    7690
    34357
    87977
    78134
    6271
    72856
    43004
    81631
    4654
    94363
    37138
    62061
    18913
    42432
    11926
    9778
    23507
    52921
    12302
    61620
    89415
    52561
    8564
    80333
    62937
    17680
    49024
    37850
    54127
    92136
    65865
    19416
    86651
    81030
    12473
    37840
    36215
    88329
    23844
    38832
    1807
    1726
    84720
    10551
    12770
    33510
    23806
    6831
    41122
    36046
    2410
    11380
    8861
    18964
    37605
    2021
    59504
    57029
    64121
    85107
    64293
    64821
    72694
    32390
    55767
    3884
    74771
    393
    21050
    70556
    39830
    42172
    5615
    47643
    48677
    5093
    38547
    4808
    74607
    71200
    88387
    94071
    45031
    83426
    83246
    96061
    91471
    37207
    57815
    30779
    45176
    70833
    29490
    27760
    74104
    21444
    73173
    10086
    56241
    48369
    73755
    93275
    66791
    2437
    18827
    61990
    3213
    43007
    46942
    47386
    98002
    80099
    90898
    28860
    53348
    3790
    54478
    50789
    53673
    81845
    76946
    31398
    15539
    43923
    68172
    43943
    11674
    5147
    49577
    7639
    2902
    56983
    51372
    87907
    65260
    46019
    69134
    65982
    35068
    81730
    76650
    67535
    65607
    86101
    4387
    9658
    56971
    38760
    90175
    26434
    22509
    10166
    19048
    3135
    28671
    63621
    90284
    56798
    82077
    15749
    77755
    45814
    51006
    26305
    31977
    48619
    18712
    90691
    8001
    32067
    70357
    38111
    41552
    74876
    81391
    40492
    24784
    22370
    39440
    57089
    73160
    45027
    53617
    35969
    46450
    40871
    71843
    12703
    17953
    52853
    69725
    67213
    62722
    73693
    91338
    14128
    12506
    75060
    56344
    31645
    23821
    2907
    2229
    7702
    54151
    49626
    34757
    19073
    1923
    11433
    4156
    34993
    47527
    28810
    55157
    69505
    65503
    64854
    23249
    79143
    9697
    35584
    42411
    13695
    7789
    66572
    60321
    54166
    71208
    76781
    69793
    42022
    52118
    62723
    2774
    17563
    10157
    73884
    64476
    44243
    84801
    83448
    68584
    56296
    77751
    95159
    23154
    24632
    8184
    39214
    52344
    46545
    33325
    85650
    14755
    92211
    34714
    41604
    90705
    97995
    76462
    85611
    76657
    58480
    7258
    91761
    17400
    74630
    8191
    83012
    85542
    71016
    35146
    50365
    37585
    62220
    2323
    23949
    50093
    8154
    66092
    75562
    15603
    49424
    19639
    37679
    18186
    78875
    40160
    63991
    10977
    53885
    83218
    34001
    3723
    63889
    1
    40515
    36743
    42770
    32026
    24502
    52208
    17897
    78882
    26409
    74817
    50557
    4129
    97514
    67021
    28240
    45301
    98467
    53298
    94746
    59508
    4533
    28812
    79175
    57458
    71279
    14985
    61081
    72641
    50192
    24833
    10559
    3359
    31540
    74717
    6619
    34886
    22723
    62826
    4364
    44080
    4087
    31292
    76363
    98421
    92175
    71837
    88423
    84188
    63345
    30108
    18021
    38992
    73015
    6978
    19730
    77314
    20601
    73041
    40457
    43550
    33086
    86253
    71896
    24236
    1291
    9491
    16822
    91587
    98602
    26555
    30077
    10302
    24493
    2985
    39469
    90347
    30520
    42477
    56481
    5914
    38961
    10218
    16024
    93342
    92630
    7566
    74142
    54657
    81366
    88386
    85815
    4565
    5439
    1104
    2673
    65606
    83445
    70854
    9537
    73222
    2544
    31425
    63015
    81452
    90318
    75062
    83615
    19052
    92492
    48714
    85098
    15267
    31282
    91826
    92471
    43067
    73944
    47591
    71457
    79798
    90235
    60824
    53372
    53812
    27261
    49099
    19917
    76978
    99670
    58487
    33747
    16944
    30719
    18716
    76276
    93076
    70826
    63639
    85111
    98441
    21908
    35279
    33927
    33433
    77583
    95025
    31616
    25321
    37617
    93145
    11286
    15024
    6719
    64723
    4077
    78584
    30370
    98798
    67730
    21048
    1287
    87867
    44930
    4798
    37691
    61593
    86819
    50990
    9059
    57590
    71412
    14209
    43285
    79232
    43891
    290
    36110
    69671
    88539
    59260
    88464
    54759
    40328
    37037
    85253
    94603
    18976
    89833
    74448
    90717
    20688
    18961
    46537
    53603
    42627
    39150
    8087
    37842
    80079
    33426
    48812
    47406
    10748
    44375
    61932
    80967
    63310
    7592
    70797
    1452
    3192
    30692
    27239
    31166
    77857
    51830
    22097
    68817
    55733
    33720
    78069
    51195
    32571
    12279
    28924
    66443
    51929
    95208
    55440
    17321
    82411
    38022
    61143
    50625
    2213
    8447
    95005
    15634
    39956
    99281
    88705
    97294
    67363
    47231
    17704
    69554
    19093
    38744
    709
    50363
    21233
    75916
    53339
    97687
    88562
    35763
    85496
    96919
    60369
    9870
    11363
    9941
    6401
    38441
    91650
    9102
    62077
    19340
    10745
    42333
    66689
    39672
    6473
    15741
    61335
    31890
    16099
    15865
    6445
    81665
    85352
    8749
    65186
    11147
    62916
    33332
    84931
    39050
    34043
    79368
    16678
    85675
    17812
    29439
    26532
    82653
    65587
    57526
    21148
    29904
    27408
    7756
    23943
    33633
    49278
    28774
    72872
    9540
    53171
    64267
    52998
    4098
    29864
    36202
    47534
    50455
    82772
    12347
    34049
    78222
    90264
    10215
    84769
    42361
    13264
    13181
    66773
    26246
    74122
    84239
    9743
    33012
    32183
    2602
    70562
    20340
    62909
    73842
    5968
    44347
    60842
    3905
    54985
    57584
    10738
    39266
    70711
    60420
    41807
    10619
    27691
    28387
    47429
    65781
    49825
    1752
    27004
    79338
    6714
    19519
    22796
    4086
    66695
    82806
    81923
    70029
    78043
    17813
    74517
    1511
    25527
    20419
    26266
    90542
    27647
    56104
    17055
    62523
    64731
    65832
    49687
    46803
    69704
    50396
    2311
    87194
    92658
    70094
    91902
    29154
    2953
    14475
    21086
    26777
    6337
    6024
    43316
    75225
    96054
    41957
    8842
    39904
    43313
    33834
    37062
    51515
    23681
    73489
    81967
    93066
    76128
    48996
    55462
    10655
    3320
    32287
    13924
    32838
    4013
    85822
    33106
    15586
    62938
    67492
    18225
    7109
    72726
    93494
    97566
    24625
    6993
    46189
    13906
    70171
    92259
    21202
    68892
    96783
    62823
    62087
    70942
    92548
    64324
    42702
    47758
    39682
    68866
    50780
    90020
    12259
    15487
    28282
    73821
    13175



En línea

Pitagoras

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Re: AYUDA CON Inversiones de 1
« Respuesta #1 en: 3 Mayo 2022, 12:32 pm »

Por favor Ayuda!! :(


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: AYUDA CON Inversiones de 1
« Respuesta #2 en: 3 Mayo 2022, 20:53 pm »

Citar
...modificar el codigo para que haga las inversiones de 1...
A qué llamas 'inversiones de 1'... ?.
Fuerzas a mirar el código para intentar dilucidar el asunto, las cuestiones que plantea el interesado deberían quedar claramente definidas en la prosa sin necesidad de tener que mirar el código, por otro lado mirando el código, pareciera que llamas inversiones a cada intercambio...

...pero cuando luego uno lee:
Citar
...con un conjunto de numeros de entre los cuales se proporciona el numero uno y aparece en la lista de numeros una sola vez. Y tengo que hallar las inversiones de 1...
...ya no queda claro, ahora pareciera uno entender que entre todos esos valores se ha incluído uno con valor 1, y que se trata de contar cuantas veces cambiara ese valor de la 'parte alta' a la 'parte baja' y viceversa (asumo), por lo que lo que hay en el código es solo el 'intento' y por tanto no sirve para deducir tu propósito.

¿Por qué usas ese algoritmo?... El código es tortuoso y sin duda lento además de consumidor de memoria extra.

p.d.: Olvidaba decirte, que para poner valores de ejemplo (en el foro), basta poner 20-30 cifras, no 1000... ni 1 millón.
« Última modificación: 3 Mayo 2022, 20:55 pm por Serapis » En línea

Pitagoras

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Re: AYUDA CON Inversiones de 1
« Respuesta #3 en: 5 Mayo 2022, 13:45 pm »

Disculpa que no me haya expresado correctamente, tienes razon.
A inversiones de uno me refiero a: por medio del diseño del algoritmo recursivo Sort-and-Cout, usando un proceso Merge-and-Cout para hacer el Merge(eso ya esta implementado). Contar el numero de inversiones en dos listas ordenadas. A inversiones de 1 me refiero a el numero de veces por las que tiene que pasar ese numero hasta poder llegar a estar ordenado en la lista (como resultado me han dicho que me tiene que dar 545).
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: AYUDA CON Inversiones de 1
« Respuesta #4 en: 5 Mayo 2022, 18:18 pm »

Bien, aclarado lo d elas 'inversiones' y no tener que entrar en suposiciones: es cada asignación, pero de un valor cuya magnitad es 1 y solo existe una vez en origen, cuando procede del grupo de la derecha (el grupo alto).

No he revisado si el código está correctamente implementado, ya que es tortuoso y fuerza a uno a desistir, mirando solo por encima. ...dando por supuesto que te funciona bien, ya que tú mismo así lo expresas. de hecho sería adecuado que antes de introducir esas líneas d ecódigo verificaras que el algoritmo ordena correctamente la lista...
...entonces (si el algoritmo funciona bien) lo que te resta es llevar la cuenta en el sitio adecuado.

Y dónde se debe llevar la cuenta?. Allí dónde dicho valor es asignado desde la lista 'right'.
Punto 1: - Dado que el valor 1 es el menor la cuenta debe llevarse solo cuando (y nada más que cuando) el valor 1 se localiza en la lista de la derecha (right, el grupo de índices mayor). Hay 2 sitios donde esto puede suceder. Nota el 'puede suceder', ya que esto implica un condicional, como verás...

Aclarado esto... el pseudocódigo del meollo de la cuestión:
Código:
...
hacer mientras ((i < left.length) y (j < right.length))
    Si (left[i] <= right[j])
        a2[k] = left[i]

        i +=1
    sino  
        // Punto 1:
        a2[k] = right[j]
        si a2[k] = 1     //valor
            cont +=1
        fin si

        j +=1
    fin si
    k +=1
siguiente
...

//Punto 2:
hacer mientras (j < right.length) {
    a2[k] = right[j]
    //si a2[k] = 1     //valor
    //    cont +=1
    //fin si

    j +=1
    k +=1
siguiente


Al terminar ese bucle, en efecto, al menos una de las listas (left, right) puede no haberse recorrido hasta el final, luego toca pasar el resto de dicha lista a la de a2, en ese caso no hay intercambio de posición.
Punto 2: - Pero si el valor 1 estuviera en ese resto de la lista, no deberá contarse. Técnicamente en este apartado, no debe contarse porque solo trata de regresar fusionar el resto de la lista de la derecha en la lista principal.
No obstante lo he dejado puesto y comentado, por si el problema se considera de otro criterio...

Para terminar, la variable cont, da demasiadas vueltas de acá para allá, es más sencillo si simplemente lo declaras a nivel de la clase, antes de ejecutar el algoritmo se le da el valor 0 y al final se exhibe su cuenta... La razón es que dicha variable modifica el algoritmo, el algoritmo y todas las funciones dependientes, por tanto no son independientes de su uso, luego ni es práctico ni precisa ser aislada en cada función. De hecho si más adelante se reclama modificar el algoritmo para que haga otra cosa distinta, los cambios serán menores.
Es decir, trata de independizar el trabajo del algoritmo, de lo que luego se solicita internamente del algoritmo (llevar una cuenta específica), que incluso uno podría añadir ese código como código de compilación condicional, pero que sin ser necesario es adecuado para reflejar la diferencia entre el código del algoritmo y el código extra para cumplir lo solicitado.

Remarco en rojo (y por ello lo meto en etiqeutas quote y no code), los cambios principales... del resto de funciones comenta también el 'return cont', solo nos interesa hacer la cuenta (si hemos declarado dicha variable a nivel de la clase).

Citar
public class Inversiones {
    int cont=0;
    int valor=1;
...

    private static int ordenar(double[] a2, int min, int max) {
      int cont=0;
      int middle = (min+max)/2;
      if(min<max) {
         //cont =
                        ordenar (a2, min, middle);
         //cont = cont +
                        ordenar (a2, middle + 1, max);
         //cont = cont +
                        merge (a2, min, middle, max);
      }
      //return cont;
   }

...
    public static void main(String[] args) throws IOException {
      Scanner leer = new Scanner(new File("C:\\Ruta\\InversionsTest.dat"));
      int nCases = leer.nextInt();
      
      double a[] = new double[nCases];
      for(int i=0; i<nCases; i++) {
         a= leer.nextInt();
      }
      
                cont = 0;
                valor =1;
                ordenar(a, 0, a.length-1));

      System.out.println("El número de inversiones que tiene el array dado es: " + cont
   }

Otra cosa, para hacelro más útil, es que declares otra variable a nivel de clase, donde su valor se establece a valor solicitado (1 en el caso presente), tras "cont = 0", así si luego te piden que en vez de hacer la cuenta para el valor 1, te lo reclaman para el valor 1000, te basta cambiar una sola línea de código y es fácil saber donde localizarla. Estas líneas las he marcado de color verde y en el pseudocódigo de más arriba, se utiliza comentado.


...por lo demás como no he probado ni mirado el código a fondo, ten cuidado de agotar el espacio de pila, cosa que se puede producir con funciones recursivas si no están adecuadamente acotadas...


p.d.: al final he tenido un tiempito esta noche y he recreado el algoritmo mergesort, el caso es que tomando tu lista de valores, el número de 'inversiones de 1', que me arroja es de 5.
« Última modificación: 6 Mayo 2022, 01:47 am por Serapis » En línea

Pitagoras

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Re: AYUDA CON Inversiones de 1
« Respuesta #5 en: 8 Mayo 2022, 20:35 pm »

Gracias!! :D, voy a probar lo que dices, para ver si me funciona
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines