Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Getter
2 / 2 / 0
Регистрация: 09.09.2010
Сообщений: 221
1

Уникальность элементов массива

04.08.2011, 00:38. Просмотров 1128. Ответов 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
Ответы с готовыми решениями:

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

Узнать количество элементов массива строк
MS VC++ 2010 WinForms Суть вопроса. Программа считывает текстовый файл,...

Вычислить количество элементов массива, меньших С
В одномерном массиве, состоящем из п вещественных элементов, вычислить: —...

Вычислить и вывести сумму элементов массива
Ребята, подкиньте ,пожайлуста, какие-то сайты, где можна найти всю информацию,...

Создание массива элементов Label
Возможно этот вопрос уже поднимался, но я поискав среди тысячи тем так его и не...

5
HighPredator
5680 / 2002 / 720
Регистрация: 10.12.2010
Сообщений: 5,761
Записей в блоге: 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Эксперт С++
8326 / 3547 / 420
Регистрация: 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Эксперт С++
8326 / 3547 / 420
Регистрация: 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

Вычислить количество элементов массива, больших С
в textBox1 ввожу массив чисел, в textBox2 число С, при нажатии на кнопку...

Надо сделать проверку на уникальность элементов массива
Есть вот такой вод код рабочий, но есть одно но надо сделать так чтобы...

Уникальность элементов в ComboBox
Доброго времени суток уважаемые форумчане. Вновь возникла необходимость в вашей...


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

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

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