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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11
31  Programación / Programación C/C++ / Re: Orden de letras de manera alfabetica en C en: 9 Octubre 2019, 11:20 am
Intente realizar como el mencionado pero no pude me puedes orientar un poco mas porfavor
Copia el programa, estúdialo y dale curso en tu computador...
Te sale ? Que parte te confunde?
Sobre todo, distingue lo esencial (el algoritmo) de lo accesorio (la entrada/salida de datos).
32  Programación / Programación C/C++ / Re: Orden de letras de manera alfabetica en C en: 8 Octubre 2019, 18:41 pm
si son char, en el scanf no capturas con %d capturas con %c

te recomiendo buscar el algoritmo de ordenamiento de burbuja, es el mas simple de los algoritmos de organizacion

A ver, según entiendo yo, si dice "según se lee la letra se acomoda", no se trata de ordenar, sino de insertar en un vector ordenado una letra. Pero el mayor problema, veo yo, tiene que ver con el hecho de capturar caracteres de la entrada estandard. Eso es otro problema, porque la entrada buferada exige que le des al intro, y a la vez el intro es un caracter (que a t'i no te vale para tu proposito).


Propuesta:

Código
  1. /*
  2.  P : N>0 and sorted(A,0,N-1) and V=A
  3.  Q : perm(V,A) and sorted(V,0,N)
  4.  
  5.  
  6.  I : perm(V,A) and sorted(V,0,n) and sorted(V,n, N)
  7. and (0<n<N-1 - > V[n-1]<V[n+1]) and 0 <= n <= N-1
  8.  
  9.  !B : n==0 || V[n]>=V[n-1]
  10.  
  11.   B : n > 0 && V[n]<V[n-1]
  12.  
  13. |- I and !B -> Q
  14.  
  15. Quote:
  16.  
  17.   C(n) = n >= 0
  18.  
  19. |- I -> C(n) >= 0
  20.  
  21. Invariant snapshot:
  22. -------------------
  23.  
  24. 0                 n           N
  25. +-----+-----+-----+-----+-----+
  26. |  0  |  1  |  3  |  2  |  4  |
  27. +-----+-----+-----+-----+-----+
  28.  
  29. Init:
  30. -----
  31.  n = N- 1
  32.  
  33. |- P -> I[n/N-1]
  34.  
  35. Step:
  36. ----
  37.   n= n- 1
  38.  
  39. |- I and B and n=T -> (n<T)[n/n-1]
  40.  
  41. Restore:
  42. --------
  43.  
  44.   V[n],V[n-1]=V[n-1],V[n]
  45.  
  46. Pseudocode:
  47. -----------
  48.  
  49.    n=N-1
  50.    while n>0 and V[n]<V[n-1] do
  51.      V[n],V[n-1]=V[n-1],V[n]
  52.      n=n-1
  53.    done
  54.  
  55. */
  56.  
  57. void *insertChar(char V[], int N)
  58. {
  59.  for(int n=N-1 ; (n && V[n]<V[n-1]);n--)
  60.    {
  61.      const int An=V[n];  /* To do swapping */
  62.      V[n]=V[n-1];
  63.      V[n-1]=An;
  64.    }
  65.  return V;
  66. }
  67.  
  68.  
  69.  
  70. #include <stdio.h>
  71. #include <string.h>
  72.  
  73.  
  74. #define MAX 100000
  75. int main(int argc, char* args[])
  76. {
  77.  int N;
  78.  char V[MAX];
  79.  memset(V,0, MAX);
  80.  
  81.  for(N=0 ; (scanf("%c",&c)==1) && c!='\n' ; )
  82.    {
  83.      V[N++]=c;
  84.      printf("%d %c %s\n",strlen(V),c,insertChar(V,N));
  85.    }
  86.  return 0;
  87. }

Ejemplp:

Código:
 gcc char.cc -o char && ./char
enunlugardelamancha
1 e e
2 n en
3 u enu
4 n ennu
5 l elnnu
6 u elnnuu
7 g eglnnuu
8 a aeglnnuu
9 r aeglnnruu
10 d adeglnnruu
11 e adeeglnnruu
12 l adeegllnnruu
13 a aadeegllnnruu
14 m aadeegllmnnruu
15 a aaadeegllmnnruu
16 n aaadeegllmnnnruu
17 c aaacdeegllmnnnruu
18 h aaacdeeghllmnnnruu
19 a aaaacdeeghllmnnnruu
33  Programación / Programación C/C++ / Re: estructuras de datos en: 8 Octubre 2019, 09:34 am
Pero es que nadie va a responder a nuestra programadora argentina?  :D :D

hoal quiero apsar este algoritmos a recursivo e ayudan? solo tengo esto

Código
  1. int vertir-un-numero(int n)
  2. {
  3. tpila pila;
  4. init_stack(pila);
  5. while(n>0){
  6. push_stack(pila,n%10);
  7. n/=10;
  8. }
  9. for(int i=0;empty_stack(pila)==false;i++)
  10. n+=pop_stack(pila)*pow(10.0,i);
  11. return n;
  12. }

Antes de dar la solución, aprecio un fallo de eficiencia... No es necesario en el segundo bucle expresar pow(10.0,i)... puedes poner

Código
  1. for(int i=0,power=1;empty_stack(pila)==false;i++)
  2. {
  3. n+=pop_stack(pila)*power;
  4. power *=10 ;
  5. }
  6.  

Y te ahorras la función pow que trabaja con floats, algo que es "peligroso" en computación.


Lo normal es que te den el iterativo y tengas que hacer el recursivo. Si la función recursiva es lineal (con una sola llmada) entonces hay truco fácil. (Un poco largo para explicar aquí)

Lo que yo hago en estas lineas es dar el programa al que se aplica el truco. Es una función lineal no final, es decir, después de la llamada hay quqe hacer algo más, que en la veris'on iterativa realiza el segundo bucle...

Allá va:

Código
  1. int invertir_un_numeroG(const int N,int &power);
  2.  
  3. /*
  4.  P : A[0..log(N)) and N = \sum i : 0 <= i < log(N) : A[i]*10^i
  5.  Q : M = \sum i : 0 <= i < log(N) : A[i]*10^(log(N)-i)
  6. */
  7. int invertir_un_numero(const int N)
  8. {
  9.  int power;
  10.  return invertir_un_numeroG(N,power);
  11. }
  12.  
  13.  
  14. /* P' : P
  15.    Q' : Q and power=10^log(N)
  16. */
  17. int invertir_un_numeroG(const int N,int &power)
  18. {
  19.  if (N==0) { power = 1 ; return 0 ; }
  20.  int result;
  21.  result = invertir_un_numeroG(N/10,power);
  22.  result += N%10 * power ;
  23.  power *= 10;
  24.  return result;
  25. }
  26.  
  27. #include <iostream>
  28.  
  29. using namespace std;
  30.  
  31. int main(int argc, char* args[])
  32. {
  33.  int N;
  34.  for( ; cin >> N ; )
  35.    cout << invertir_un_numero(N) << endl;
  36.  return 0;
  37. }


Y algunos casos de prueba

Código:
bash-2.04$ ./main
45
54
4678
8764
12345678
87654321
34  Programación / Programación C/C++ / Re: Comunicacion entre hilos. Consumidor-Productor en: 4 Octubre 2019, 17:53 pm
Sí, siempre se debe usar un while...[...]
La respuesta de RayR es muy acertada.

Como norma general, hay que poner while. Sólo analizando un caso particular puedes poner if con seguridad, pero tampoco se gana tanto en eficiencia...

Si te lia tu "intuición operacional", (ya que, si es difícil la programación secuencial, la concurrente es inabordable por la explosión de estados) de te recomiendo el siguiente esquema en pseudo lenguaje

Código:
(one thread) 
<await B(var) -> S>

(other thread)
<var = e>
Se traduce en C a lo que refleja el código :
Código:
(one thread)
pthread_Mutex_lock(l)
while !b do pthread_cond_wait(l, c) ;
S
pthread_Mutex_unlock(l)

(other thread)
pthread_Mutex_lock(l)
var=e
pthread_cond_signal(c)
pthread_Mutex_unlock(l)

Por último, antes de manejar variables de condición en C, estudia teoría de monitores en papel y pseudo código! Las variables de condición y mutex asociados no se pueden comprender sin ellos. Fueron creados para implementar esa idea, aunque el lenguaje C no los implementa directamente. java, por ejemplo, si, pero se una forma muy limitada).

la gente las utiliza sin saber su razón de ser
(Perdón por la imprecision, pero estoy escribiendo dese un móvil)
35  Programación / Programación C/C++ / Re: Problema k-paired (k-emparejados) en O(N) en: 25 Septiembre 2019, 17:13 pm
Asi sólo con datos de tiempos, y no en una gráfica es dificil de ver....

Haz una ultima prueba, con distros aleatorias y k = 1.

Si interpolaramos en una gráfica  las mediciones, deberíamos ver que las medidas de cada una se acercan a 3 rectas... (por eso es linear. Desde la teoría de la complejidad, da igual que una vaya el doble, el triple, o k-veces más rápido, los factores constantes dan igual...)

Pero si se interpolan las curvas y vemos que alguna da una parabola, algo no va bien, pues en los tres casos, n_paired, k_paired, y zoz?paired son lineales...  Si, en el doble bucle interior tambien se comporta lineal, ya que al ser la instrucción critica se ejecuta un máximo de N veces...

La que no debería ser una recta es la del  lower_bound...

Un buen trabajo ! Enhorabuena


Los elementos del vector sí están ordenados (y no se repiten), sólo que son generados al azar. Pongo el algoritmo acá abajo:

Se invoca con el vector ya del tamaño apropiado; se carga con valores al azar, se ordena y se eliminan los duplicados:


36  Programación / Programación C/C++ / Re: Problema k-paired (k-emparejados) en O(N) en: 24 Septiembre 2019, 10:45 am
Sí sí, es que quería mantener una atmósfera de misterio...
Y ejecutando la misma prueba para cada una de las tres funciones, en Visual Studio, ha resultado:

Curioso, al menos a mí me lo parece.
Jé, nuevo desafío... ¿quién me lo explica?
Un momento, amigo...

Código:
Elementos al azar (uniform distribution) desde 1 hasta 2147483647

Las pruebas quedan invalidadas... Si pones elementos al azar, entonces ya no estarán ordenados estrictamente creciente, y los algoritmos no funcionarán en absoluto... Es conforme a esa precondición que programamamos el algoritmo... De nada sirve ir muy rápido si no computa las cosas que se espera.

Si los elementos están al azar, no ordenados, entonces, el algoritmo solo puede ser O(N^2). Por supuesto, este no vale, hay que cambiarlo.
37  Programación / Programación C/C++ / Re: Problema k-paired (k-emparejados) en O(N) en: 20 Septiembre 2019, 10:14 am
Tu mensaje esta lleno de cosas interesantes....
...
 Si te fijas en esta línea:
Código:
it = std::lower_bound(it, j, s);
it queda posicionado en la posición buscada o en una más allá del límite s, esperando en el mejor lugar para la próxima iteración. Y lower_bound es un binary search, logarítmico, que es mejor que avanzar secuencialmente, o mejor dicho, creí que debería serlo.

La clave está en que estamos juzgando el caso peor, y tu distribución std::iota (junto con el valor k) puede entrar en ese caso.

 Como tu dices, binSearch es logaritmico, pero fijate, debido a la distrbución std::iota (junto con el valor k) trabajas mucho  para avanzar solamente 1 posición, cosa que se consigue en el mío en O(1) m=m+1.
Imaginate k=2
Código:
1  5  6........................................................... 1000000000 (Arbitrariamente grande,N)
trabajas mucho (del orden de O(log(N)) para pasar del 1 al 5, del 5 al 6


Citar
Yo también probé con una solución (aparentemente) muy inferior a la versión con lower_bound, donde lo reemplazo por un estúpido find, haciendo ahora sí una solución (prácticamente) O(N2), pero no, curiosamente:

Código
  1. size_t n_pares(const std::vector<int>& v, int k)
  2. {
  3.    assert(std::is_sorted(v.begin(), v.end()) && "v debe estar ordenado.");
  4.    assert(v.size() && "v no puede venir vacio.");
  5.  
  6.    auto n{ 0u };
  7.    auto it = v.begin();
  8.  
  9.    for (auto i = v.begin(), j = v.end(); i != j; ++i)
  10.    {
  11.        it = std::find(it, j, *i + k);
  12.  
  13.        if (it != j) {
  14.            ++n;
  15.            ++it;
  16.        }
  17.        else {
  18.            it = i + 1;
  19.        }
  20.    }
  21.  
  22.    return n;
  23. }

Ahora los resultados son hasta ligeramente mejores que los de los de k_paired. Joder.


UN mundo muy ingrato.


Je,je,je... Tiene toda la explicacion... En este caso, la naturaleza de iota, k, y el problema, constituyen el caso mejor para find... No tienen que moverse casi nada, estan preguntando por el elmeento siguiente y los datos de entrada están al principio, no da "saltos" como el binsearch. con k=4

Código:
1  5  6........................................................... 1000000000 (Arbitrariamente grande,N)

Del 1 al 5, la busqueda se detiene en el primero. Idem para 5  a 6...

A nadie engañamos diciendo que es en O(N^2) en el caso peor... Pero este, era el mejor caso posible...
38  Programación / Programación C/C++ / Re: Problema k-paired (k-emparejados) en O(N) en: 19 Septiembre 2019, 09:12 am
Estupendo intento, Loretz, buena exhibición de recursos... No obstante creo que el punto flaco reside en la llamada que haces a lower_bound, lo que eleva la complejidad de tu algoritmo a O(Nlog(N)). Mejor que cuadrático O(N^2), al menos...

...
    for (auto i = v.begin(), j = v.end();
        i != j && it != j;
        ++i)
    {
        auto s = *i + k;
        it = std::lower_bound(it, j, s);

        if (it != j && *it == s) {
            ++n;
            ++it;
        }
    }
...


A ver que te parece   ésta, en O(N): Brevemente, para evitar llamadas a lower_bound, controlas con una variable extra m, que parte del vector recorrido YA sabes que no va a emparejar con el actual en curso V[n], por lo que no hace falta volver a recorrer...
Ah!, y lo mismo vale para vectores vacíos

Código
  1.  
  2. /*        
  3.  P : strict(V)
  4.  fun k_paired(V[0..N) of int, int k) dev r
  5.  Q : r =#i,j : 0 <= i , j<N : V[j]-V[i]=k
  6.  
  7.  I : Q[N/n] and 0 <= m <= n <= N and
  8.      n<N -> \forall i : 0<=i < m : V[n]-V[i] > k   **
  9.  
  10.      ** m for efficiency reasons, discarding
  11.         subtrahends V[i] far from V[n].
  12.      
  13.  
  14.  !B : n==N     B: n<N
  15.  
  16.   C(N,n,m)= 2N - (m+n) >= 0
  17.  
  18.  
  19.  
  20. Invariant snapshot:
  21. -------------------
  22.  
  23. k = 20  , r = 0
  24. 0                 m                             n           N
  25. +-----+-----+-----+-----+-...-+-----+-----+-----+-----+-...-+
  26. |  1  |  3  |  5  |  40 |     |     | 49  | 50  | 60  |     |
  27. +-----+-----+-----+-----+-...-+-----+-----+-----+-----+-...-+
  28.  
  29.  
  30. */
  31.  
  32.  
  33.  
  34. #include <iostream>
  35.  
  36. using namespace std;
  37. int k_paired(const int V[], const int N, const int k)
  38. {
  39.  int n,m,r;
  40.  for(n=m=r=0;n<N;)
  41.    if (V[n]-V[m] <= k)
  42.      r+=(V[n++]-V[m] == k);
  43.    else m++;
  44.  return r;
  45.  
  46. }
  47.  
  48. #define MAX 100000
  49.  
  50. int main(int argc, char **args)
  51. {
  52.  int N,k;
  53.  int V[MAX];
  54.  for(cin >> N ; N!=-1 ; cin>>N)
  55.    {
  56.      cin >> k;
  57.      for(int n=0;n<N;n++)
  58. cin >> V[n];
  59.      cout << k_paired(V,N,k) << endl;
  60.    }
  61.  return 0;
  62. }
  63.  

A ver si pudieras medir tiempos con tus clases C++...
39  Programación / Programación C/C++ / Re: Problema k-paired (k-emparejados) en O(N) en: 18 Septiembre 2019, 17:04 pm
 ;-) ;-) ;-) ;-)

YreX-DwX, bravo!  Yo mismo no podría haberlo explicado mejor...

Ahora... alguien se anima a hacerlo en O(N)?
En O(N^2) no tiene mucho mérito...
40  Programación / Programación C/C++ / Problema k-paired (k-emparejados) en O(N) en: 17 Septiembre 2019, 14:44 pm
Dado un vector de enteros V[0..N) , con todos sus componentes siguiendo un orden stricto creciente, (1,5,17,20) y un numero k >=0 , diseñar un algoritmo de complejidad lineal que resuelva el número de pares de componentes <i,j> , con 0<=i,j<N, tales que Vi-Vj=k.

En la siguientee lineas se da unos ejemplos como ilustracion

Código:
5 3   (Numero de componentes del vector y k)
1 4 5 6 8  (Componentes del vector)
 2  (Resultado)

4 2 (Numero de componentes del vector y k)
1 4 5 6 (Componentes del vector)
 1  (Resultado)


3 0 (Numero de componentes del vector y k)
1 2 3 (Componentes del vector)
3 Resultado)


Yo dispongo de la solución. La pongo en dos días. Pero ahí esta el reto. Cuanto más simple mejor!
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines