Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++/CLI

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Getter
2 / 2 / 0
Регистрация: 09.09.2010
Сообщений: 221
#1

Уникальность элементов массива - C++/CLI

04.08.2011, 00:38. Просмотров 1120. Ответов 5
Метки нет (Все метки)

Здравствуйте, подскажите, как удалить повторяющиеся элементы массива array<int>^name, отсортированного по возрастанию? Просто перебор не катит, там элементов > 500 000.
Написал вот свой алгоритм, но он как-то долго и криво работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Del::Shift(array<int>^nums, int start,int length, int delta){
     for(int i=start; i<length; i++)
      nums[i]= nums[i+delta];
}
 
void Del::DelDouble(array<int>^nums, int length){
    int start= 0;
    bool flag= false;
    
    for(int i=0; i<length; i++){
        if(nums[i]==nums[i+1]){
          if(!flag) start= i;
          flag= true;
          continue;
        }
        else if(nums[i-1]!=nums[i]) continue;
        else {
            length-= i-start;
            Shift(nums, start, length, i-start);
            i= 0;
            flag= false;
        }
    }
    Array::Resize(nums, length);
}
Суть алгоритма не в передвижении каждого элемента, а так как он отсортирован, сразу в передвижении блоков одинаковых чисел.

Добавлено через 11 минут
<vector> вроде что-то такое умел, а вот на .net мб что-то подобное есть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2011, 00:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Уникальность элементов массива (C++/CLI):

Умножить элементы массива, делящиеся на 3 без остатка, на среднее арифметическое элементов массива, делящихся на 2 без остатка. - C++/CLI
Умножить элементы массива, делящиеся на 3 без остатка, на среднее арифметическое элементов массива, делящихся на 2 без остатка. Программа...

Создание массива элементов Label - C++/CLI WinForms
Возможно этот вопрос уже поднимался, но я поискав среди тысячи тем так его и не нашел. Прошу у вас помощи уважаемые форумчане. У меня...

.NET 2.x Уникальность элементов в ComboBox - Visual Basic .NET
Доброго времени суток уважаемые форумчане. Вновь возникла необходимость в вашей помощи. Заранее извиняюсь за глупость моего вопроса. ...

Проверить массив A на уникальность элементов - JavaScript
Помогите решить задачу (использовать готовые функции/методы нельзя) 2.4. Напишите функцию, которая проверяла бы массив A на...

Одномерные массивы. Вставка, удаление элементов массива. Перестановка элементов массива. Сортировка массива методом пузырька - Pascal
Помогите пожалуйста! Дан массив, состоящий из N букв латинского алфавита а) Заполнить массив датчиком случайных чисел б)...

Произведение положительных элементов массива, сумма элементов массива, удаление четных элементов - Turbo Pascal
в одномерном массиве состоящим из n элементов вычислить: произведение положительных элементов массива; сумму элементов массива,...

5
HighPredator
5645 / 1962 / 373
Регистрация: 10.12.2010
Сообщений: 5,687
Записей в блоге: 3
04.08.2011, 10:45 #2
После каждого "сжатия" имеет смысл перемещаться к месту начала сжимаемого блока, а не началу массива.
0
Getter
2 / 2 / 0
Регистрация: 09.09.2010
Сообщений: 221
04.08.2011, 12:45  [ТС] #3
Тоесть
C++
1
i= start
так?
Но все равно глючит

Добавлено через 48 минут
Сделал проще Да и работает в разы быстрее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array<int>^ Del::DelDouble(array<int>^nums, int length){
    array<int>^ Second= gcnew array<int>(length);
    int record= 1;
    Second[0]= nums[0];
 
    for(int i=1; i<length; i++){
         if(Second[record-1]!=nums[i]){
       Second[record]= nums[i];
       record++;
      }
    }
    Array::Resize(Second, record);
    return Second;
}
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 143
Регистрация: 03.07.2009
Сообщений: 10,708
04.08.2011, 13:14 #4
Getter, такой способ, он неплохой по перфомансу, но бьет по памяти.
Внутри метода создаете новый массив, такого же размера, в который и записываете уникальные элементы.
C++
1
2
3
4
5
6
7
8
9
10
array<int>^ Del::DelDouble(array<int>^nums, int length){
   int i, k = 0;
   array<int>^ temp = gcnew array<int>(length);
   temp[k] = nums[0];
   for (i = 1; i < length; ++i)
      if(nums[i] > temp[k])
         temp[k++] = nums[i];
   Array::Resize(temp, length);
   return temp;
}
или, если используете .NET 3.5 и выше, то так
C++
1
nums = nums->Distinct()->ToArray();
Добавлено через 2 минуты
Угу, с первым способом немного опоздал
1
Getter
2 / 2 / 0
Регистрация: 09.09.2010
Сообщений: 221
04.08.2011, 17:46  [ТС] #5
Цитата Сообщение от M128K145 Посмотреть сообщение
или, если используете .NET 3.5 и выше, то так
Код C++1 nums = nums->Distinct()->ToArray();
Это вот и есть удаление одинаковых элементов?
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 143
Регистрация: 03.07.2009
Сообщений: 10,708
04.08.2011, 18:11 #6
Getter, это есть возврат массива уникальных элементов используя LINQ
1
04.08.2011, 18:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2011, 18:11
Привет! Вот еще темы с ответами:

В одномерном массиве, состоящем из n вещественных элементов вычислить минимальный элемент массива и сумму элементов массива. [CPP] - C++
В одномерном массиве, состоящем из n вещественных элементов вычислить минимальный элемент массива и сумму элементов массива, расположенных...

Даны два целочисленных массива С из 10 элементов и D из 12 элементов. Получить все элементы массива C, которые входят в массив D - Turbo Pascal
Огромная просьба помочь 2) Даны два целочисленных массива С из 10 элементов и D из 12 элементов. Получить все элементы массива C,...

Найти среднее арифметическое элементов массива, из элементов массива, меньших среднего арифметического, сформировать новый массив - Visual Basic
Дан одномерный массив. Найти среднее арифметическое элементов массива, из элементов массива, меньших среднего арифметического, сформировать...

Найти сумму всех элементов массива целых чисел, которые меньше среднего арифметического элементов массива. - Turbo Pascal
Найти сумму всех элементов массива целых чисел, которые меньше среднего арифметического элементов массива. Размерность массива –20....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru