Как вставить элементы в массив без дубликатов? - PullRequest
0 голосов
/ 01 февраля 2019

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

Примечание: эти элементы представляют собой числа с 10 цифрами, матрица, содержащая занятые места, это не вариант

1 Ответ

0 голосов
/ 01 февраля 2019

Если вы хотите сохранить все элементы только один раз , вы можете использовать STL set в c++ (примервыполнение этого в c также дано ниже).Хранит значение не более одного раза.Вы можете объявить set следующим образом:

set<int>sett;

Чтобы вставить значение в set

sett.insert(6);

Чтобы напечатать все значения внабор:

for(auto a: sett){
    cout<<a<<endl;
}

Вы можете перейти на веб-сайт geekforgeek и cplusplus для получения дополнительной информации.

Если вы хотите отслеживать число в массиве или нет, вы можете сделать это эффективно следующим образом:

Возьмите Boolean Array или Карта и установите начальное значение false.После сканирования из файла, если число равно N, сделайте N-й индекс Boolean Array или Map true.

Теперь, если вы хотите проверить число M в массиве или нет.Вы можете легко получить это, проверив, является ли индекс Mth логического массива или карты true или нет всего за O (1) раз.

См. Пример ниже, это делается с использованием логического массива.Не забудьте объявить логический массив глобально, если размер логического массива слишком велик.Вы можете сделать это, используя STL Map тоже в c++.Чтобы узнать больше о SLT MAP , посетите cplusplus , cppreference , geeksforgeeks .

#include <stdio.h>
#include <stdbool.h>

bool mapp[999999999] = {false};

int main()
{
    int i, n, t, m, ara[1000];
    printf("Input the size of array: ");
    scanf("%d", &n);
    for(i = 0; i < n; i++){
        scanf("%d", &ara[i]);
        mapp[ara[i]] = true;
    }
    printf("Input number of time you want to check a number in array or not: ");
    scanf("%d", &t);
    while(t--){
        scanf("%d", &m);
        if(mapp[m] == true)
            printf("Number Exists\n");
        else
            printf("Number Not Exists\n");

    }
}

Вы также можете использоватьэтот трюк, чтобы не включать повторяющиеся значения в массиве.Для этого, если введенное число - «а».Проверьте, помечен ли mapp[a] как true или нет.Включить 'a' только в массив и только если mapp[a] != ture.Это небольшое изменение исключит все повторяющиеся значения из вашего массива.

scanf("%d", &n);
j = 0;
for(i = 0; i < n; i++){
    scanf("%d", &a);
    if(mapp[a] != true){
        mapp[a] = true;
        ara[j++] = a;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...