структура данных, которая содержит максимум 100 чисел и легко находит минимальное число

#c

#c

Вопрос:

Мне нужно сохранить идентификаторы между (0,100) в некоторых структурах данных, там будет не более 100 идентификаторов, и мне нужен простой и быстрый способ найти минимальное число в структуре данных и простой способ вставить и удалить определенное число в структуре данных, например, если это будет list, поэтому list.append(1) , list.append(2) list.append(99) , list.remove(2) a = list.min() . Я немного новичок в c и не уверен, какая структура данных его эффективно поддерживает.

Комментарии:

1. Я бы просто использовал вектор и std::min_element

2. Потенциально, std::set .

Ответ №1:

вы можете использовать std::set , которое обычно реализуется в виде двоичного дерева поиска.

Его методы insert() , erase() и find() имеют логарифмический размер, но могут работать лучше, если дана подсказка. Логарифмическая сложность относится к набору деревьев Java.

Я думаю, вас должно заинтересовать std::lower_bound , которое возвращает итератор к нижней границе, и std::upper_bound , которое возвращает итератор к верхней границе.

Ответ №2:

Для этого запроса существует специальная структура данных: куча 🙂

 std::vector<std::uint32_t> vInts = { 25,10,35,30,5,15 };

//converts to min heap
std::make_heap(vInts.begin(), vInts.end(), std::greater<std::uint32_t>());

//5
std::cout << *vInts.begin() << std::endl;

//pop 5
std::pop_heap(vInts.begin(), vInts.end(), std::greater<std::uint32_t>());
vInts.pop_back();
std::cout << *vInts.begin() << std::endl; //10

//pop 10
std::pop_heap(vInts.begin(), vInts.end(), std::greater<std::uint32_t>());
vInts.pop_back();

//push 20. min will be still 15
vInts.push_back(20);
std::push_heap(vInts.begin(), vInts.end(), std::greater<std::uint32_t>());
std::cout << *vInts.begin() << std::endl; //15

//pop 15
std::pop_heap(vInts.begin(), vInts.end(), std::greater<std::uint32_t>());
vInts.pop_back();

std::cout << *vInts.begin() << std::endl; //20
  

Комментарии:

1. OP также может удалять случайные числа, а не только pop minimum.

Ответ №3:

Простой:

 std::vector<int> container;
container.reserve(100);
// ... put stuff in container ...
const auto min_elem =
    std::min_element(container.begin(), 
        container.end());