Эффективность времени введения в базу данных - PullRequest
1 голос
/ 22 января 2020

У меня есть код, который требует, чтобы я сделал это:

  1. Размер ввода массива и тестовых случаев.
  2. Символ операции, такой как (I, A , D, Q) и элементы массива.

I: Добавление элемента в массив.
A: Изменит данные в базе данных на новые данные, которых нет в базе данных .
D: Удалить данные, имеющие значение X, из базы данных.
Q: Показать все данные, которые меньше, чем X, из базы данных.

Input :
<size of Array> <operations/testcase>
<I/A/D/Q> <elements of array with X value>

Пример ввода:

Input : 
6 4
3 2 3 1 5 6
I 7
D 6
A 3 5
Q 7

Output :
6 (because only 1 Q operation)

Я уже создал программу, но я думаю, что недостаточно эффективен , потому что требуется больше времени для выполнения. У меня вопрос: что мне делать, чтобы сделать мою программу более эффективной?

#include "stdio.h"
#define MAXSIZE 99999

void swap(int *a,int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

void printArr(int arr[]){
    for(int i = 0; arr[i] != NULL; i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
}

void merge(int arr[], int l, int m, int r) 
{ 
    int i, j, k; 
    int n1 = m - l + 1; 
    int n2 = r - m; 
    int L[n1], R[n2]; 

    for (i = 0; i < n1; i++) 
        L[i] = arr[l + i]; 
    for (j = 0; j < n2; j++) 
        R[j] = arr[m + 1+ j]; 

    i = 0; // Initial index of first subarray 
    j = 0; // Initial index of second subarray 
    k = l; // Initial index of merged subarray 
    while (i < n1 && j < n2) 
    { 
        if (L[i] <= R[j]) 
        { 
            arr[k] = L[i]; 
            i++; 
        } 
        else
        { 
            arr[k] = R[j]; 
            j++; 
        } 
        k++; 
    } 

    while (i < n1) 
    { 
        arr[k] = L[i]; 
        i++; 
        k++; 
    } 

    while (j < n2) 
    { 
        arr[k] = R[j]; 
        j++; 
        k++; 
    } 
} 

void mergeSort(int arr[], int l, int r) 
{ 
    if (l < r) 
    { 
        int m = l+(r-l)/2; 
        mergeSort(arr, l, m); 
        mergeSort(arr, m+1, r); 

        merge(arr, l, m, r); 
    } 
} 

int binarySearch(int arr[], int left, int right,int num){
    if(right >= left){
        int mid = (left + right) / 2;
        if(num == arr[mid]) return mid;
        if(arr[mid] > num) return binarySearch(arr, left, mid-1, num);
        else return binarySearch(arr,mid+1,right, num);
    }
    return -1;
}

int main(int argc, char const *argv[])
{

    int operations, sizeArr, numX, numY, arr[MAXSIZE];
    char type;

    scanf("%d %d",&sizeArr,&operations); getchar();
    int index = 0, counter = 0;
    for(index = 0; index < sizeArr; index++){
        scanf("%d",&arr[index]); getchar();
    }
    mergeSort(arr, 0, sizeArr - 1);

    int left = 0, deleted = 0;
    for(int j = 0; j < operations; j++){
        scanf("%c",&type); getchar();

        if(type == 'I'){
            scanf("%d",&numX); getchar();
            arr[index++] = numX;
            sizeArr++;
        }

        else if(type == 'A'){
            scanf("%d %d",&numX, &numY); getchar();
            mergeSort(arr, 0, sizeArr - 1);
            for(int i = deleted; arr[i] != NULL ; i++){
                if(arr[i] == numX){
                    int old = arr[i];
                    arr[i] = numY;
                    if(arr[i + 1] != old) break;
                }
            }

        }
        else if(type == 'D'){
            scanf("%d",&numX); getchar();
            for(int i = 0; arr[i] != NULL ; i++){
                if(arr[i] == numX){
                    int old = arr[i];
                    arr[i] = -1;
                    deleted++;
                    if(arr[i + 1] != old) break;
                    // sizeArr--;    
                }
            }
            mergeSort(arr, 0, sizeArr - 1);
        }

        else if(type == 'Q'){
            scanf("%d",&numX); getchar();
            mergeSort(arr, 0, sizeArr - 1);
            // printArr(arr);
            for(int i = deleted; i < sizeArr ; i++){
                if(arr[i] <= numX && arr[i] > -1){ 
                    counter++;
                    // printf("%d\n",arr[i]);
                }
                else break;
            }
            printf("%d\n",counter);
            counter = 0;
        }
        // printf("Size Arr : %d\n", sizeArr);
        // printf("Deleted : %d\n",deleted);
        // printArr(arr);
    }

    return 0;
}

Не могли бы вы рассказать мне мою ошибку в моей программе, более эффективную по времени?

Они не упомянули продолжительность срока. Это дает только 5/10 тестов, которые верны. Поэтому мне нужно найти другой эффективный способ ускорить мой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...