Memory allocation problem, with large values

Asked

Viewed 28 times

-1

Well I’m in trouble on one issue

Enunciation

Given an integer vector, your task is to find the k-th occurrence (left to right) of an integer v in the vector. To make the problem more difficult (and more interesting!), you should answer m queries of this type.

Input of the test cases

8 4
1 3 2 2 4 3 2 1
1 3
2 4
3 2
4 2

In this case 1.3 I am looking for the number 3, in its first occurrence in my vector, so I use the number as Indice, the result and 2, as my code does

Logic I used in the question

to solve this problem I used the following logic, I created the element struct that will receive the value and the Indice, then I created the Map struct in it will have an element struct matrix, and an array of size that will have the size of the Indice of my struct, so when I call the function creates() I use the calloc that Zera my vector, in the insert function, I check if the Indice I’m entering and 0, why if it means there are no elements in that Indice, and fill the data normally, when it is in Else, I use realloc, to add the element, in my matrix.

My code

#include <stdio.h>
#include <stdlib.h>

typedef struct elemento
{
    int valor, chave;
} Elemento;

typedef struct map
{
    Elemento **dados;
    int *tamanho;
} Map;

Map *cria(int tam);
int insere(Map *mp, int valor, int i);
Map *libera(Map *mp, int tam);

int main(int argc, char** argv)
{
    int tam, teste;
    int numero, indice;
    int i;
    while(scanf("%d %d", &tam, &teste) != EOF)
    {
        Map *matriz = cria(tam);
        for(i = 0; i < tam; i++)
        {
            scanf("%d", &numero);
            insere(matriz, numero, i + 1);
        }
        for(i = 0; i < teste; i++)
        {
            scanf("%d %d", &indice, &numero);
            if(indice <= matriz->tamanho[numero])
            {
                printf("%d\n", matriz->dados[numero][indice - 1].chave);
            }
            else
            {
                printf("0");
            }
        }
        matriz = libera(matriz, tam);
    }

    return 0;
}

Map *cria(int tam)
{
    Map *mp = malloc(sizeof(Map));
    if(!mp) return NULL;
    mp->tamanho = calloc(tam, sizeof(int));
    mp->dados = malloc(sizeof(Elemento*) * tam);
    return mp;
}

int insere(Map *mp, int valor, int i)
{
    if(mp->tamanho[valor] == 0)
    {
        mp->dados[valor] = malloc(sizeof(Elemento));
        mp->dados[valor][0].valor = valor;
        mp->dados[valor][0].chave = i;
        mp->tamanho[valor]++;
    }
    else
    {
        int size = mp->tamanho[valor];
        mp->dados[valor] = realloc(mp->dados[valor], (size + 1) * sizeof(Elemento));
        mp->dados[valor][size].valor = valor;
        mp->dados[valor][size].chave = i;
        mp->tamanho[valor]++;
    }
    return 1;
}

Map *libera(Map *mp, int tam)
{
    int i;
    for(i = 0; i < tam; i++)
    {
        free(mp->dados[i]);
    }
    free(mp);
    return NULL;
}
  • I honestly did not understand your interpretation of the problem and much less the logic of your solution.

  • I edited the question, in the Logic section that I used in the question, I speak the logic that I used, gave to understand better ?

  • No, in function insere you use the value provided as an index. What is the meaning of this?

  • put the test cases in the description now, thanks for trying to help me

1 answer

1

From what I understand of the problem, and guiding me by the principle KISS, I would do:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int tam, casos, ocor, num, *vet, i, j, k, l;
    scanf("%d %d", &tam, &casos);
    vet = malloc(tam * sizeof(int));
    if (vet == NULL)
        exit(1);
    for (i=0; i<tam; i++)
        scanf("%d", &vet[i]);
    for (j=0; j<casos; j++) {
        scanf("%d %d", &ocor, &num);
        k = 0;
        for (l=0; l<tam && k<ocor; l++)
            if (vet[l] == num)
                k++;
        if (k == ocor)
            printf("A %dª ocorrência de %d encontra-se na posição %d\n", ocor, num, l);
        else
            printf("Não existem %d ocorrências de %d no vetor\n", ocor, num);
    }
    free(vet);
    return 0;
}
  • The right result with the test cases, but the running time is high, leaves it quiet so kkkk difficult question

Browser other questions tagged

You are not signed in. Login or sign up in order to post.