2012-11-01 10 views
0

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

результат для цикла 1: {1 1 1 2}
результат для контура 2: {1 1 1 3}
результат для цикл 3: {2 1 1 3}
результат для цикла 4: {3 1 3 2}

и эта функция может генерировать результат дублирования, например, результат 2 и результат 3 то же самое. Мне нужно поставить эти результаты внутри структуры данных, но не могу поместить дублирование, если результат 2 совпадает с результатом 3, нужно сохранить только один из них, как его достичь в C?

+0

Насколько велик диапазон элементов в наборе? Если он достаточно мал, вы можете использовать растровые изображения. –

+0

может иметь до 8 записей, но растровые изображения в стандартном c? –

+0

@ratzip нет, это в математике. Тем не менее, вы можете использовать их в C с помощью '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. –

ответ

1

Если диапазон элементов достаточно мал, вы можете использовать растровые изображения как среднее для перечисления. Например. если вы хотите, чтобы представляют собой совокупность целых чисел в диапазоне от 1 до 32, все, что требуется, это 32-разрядное целое число, используемое в качестве растрового изображения:

00000001 00000001 00000000 00000000 - for set {8,16} 
    ^ ^
     8  16 

и т.д.

Если диапазон больше, использование массив байтов, где каждый бит показывает, присутствует ли значение в этом положении в наборе:

#define MAXVAL 1024 

typedef unsigned char bitmap_t[]; 
byte bitmap[1 + MAXVAL/CHAR_BIT] = { 0 }; 
// CHAR_BIT is defined in limit.h and is equal to count of bits in a byte 

void insert(bitmap_t bitmap, unsigned val) { 
    assert(val < MAXVAL); 
    bitmap[val/CHAR_BIT] |= (1 << (val % CHAR_BIT); 
} 

int is_present(bitmap_t bitmap, unsigned val) { 
    assert(val < MAXVAL); 
    return bitmap[ val/CHAR_BIT ] & (1 << (val % CHAR_BIT)); 
} 
+0

но как 11000110 10100000 00000000 00000000 - для набора {1,2,6,7,9,11} 00000001 00000001 00000000 00000000 - для набора {8,16}? –

+0

@ratzip, если бит установлен в позиции 'n' с начала растрового изображения, это означает, что целое число' n' установлено. Вот почему я спросил о диапазоне: если целые числа могут быть от 0 до 1023, вам нужно 1024 бита для представления такого набора (в этом наборе может быть не более 1024 целых чисел). –

+0

@ratzip отредактирован, чтобы сделать его более понятным. –

0

В C++ это было бы легко. Просто используйте std::set от std::tuple s. В C вам нужно реализовать все функции самостоятельно или найти хорошую библиотеку, но общий подход тот же.

Смежные вопросы