Я думаю, что это, вероятно, тривиальная проблема для решения, но я боролся с этим в течение последних нескольких дней. < /p>
Я имею следующий вектор: v = [7,3,16,4,2,1] < /code>. Я смог реализовать с некоторой помощью от Google Simple Algorithm, чтобы получить наименьший элемент в каждой итерации. После извлечения минимального элемента мне нужно уменьшить значения некоторых элементов, а затем пузырь их. < /p>
Проблема, которую я сталкиваюсь, заключается в том, что я хочу найти элементы, значение которого должно быть уменьшено в куче в постоянное время < /strong>, затем уменьшите это значение, а затем пузырьте его.
После операции Heapify Heap_Vector v_h выглядит следующим образом: v_h = [1,2,7,4,3,16] . Когда я удаляю мин элемента 1 , тогда становится вектор кучи, [2,3,7,4,16] . Но прежде чем мы сделаем обмен и пузыри, скажем, я хочу изменить значения от 7 до 4, 16 на 4 и 4 на 3,5. Но я не уверен, где они будут в куче. Индексы значений элементов, которые необходимо уменьшить, будут даны в отношении исходного вектора V . Я выяснил, что мне нужно иметь вспомогательную структуру данных, которая может отслеживать индексы кучи в отношении исходного порядка элементов (вектор индекса кучи должен выглядеть как H_IV = [2,4,5,3,1,0] после Обновите индексы кучи, когда есть изменения, но я не могу сделать это. Благодаря всем, кто может привести меня в направлении, чтобы решить мою проблему.#ifndef minheap_hpp
#define minheap_hpp
#include
// #include "helper.h"
#include
class minheap
{
public:
std::vector vect;
std::vector heap_index;
void bubble_down(int index);
void bubble_up(int index);
void Heapify();
public:
minheap(const std::vector& input_vector);
minheap();
void insert(int value);
int get_min();
void delete_min();
void print_heap_vector();
};
#endif /* minheap_hpp */
< /code>
файл .cpp < /p>
#include "minheap.hpp"
minheap::minheap(const std::vector& input_vector) : vect(input_vector)
{
Heapify();
}
void minheap::Heapify()
{
int length = static_cast(vect.size());
// auto start = 0;
// for (auto i = 0; i < vect.size(); i++){
// heap_index.push_back(start);
// start++;
// }
for(int i=length/2-1; i>=0; --i)
{
bubble_down(i);
}
}
void minheap::bubble_down(int index)
{
int length = static_cast(vect.size());
int leftChildIndex = 2*index + 1;
int rightChildIndex = 2*index + 2;
if(leftChildIndex >= length){
return;
}
int minIndex = index;
if(vect[index] > vect[leftChildIndex])
{
minIndex = leftChildIndex;
}
if((rightChildIndex < length) && (vect[minIndex] > vect[rightChildIndex]))
{
minIndex = rightChildIndex;
}
if(minIndex != index)
{
std::swap(vect[index], vect[minIndex]);
// std::cout
Подробнее здесь: https://stackoverflow.com/questions/553 ... s-in-a-min
Как создать вспомогательную структуру данных, чтобы отслеживать индексы кучи в MinHeap для работы DIDESE_KEY в C ++ ⇐ C++
Программы на C++. Форум разработчиков
1742133539
Anonymous
Я думаю, что это, вероятно, тривиальная проблема для решения, но я боролся с этим в течение последних нескольких дней. < /p>
Я имею следующий вектор: v = [7,3,16,4,2,1] < /code>. Я смог реализовать с некоторой помощью от Google Simple Algorithm, чтобы получить наименьший элемент в каждой итерации. После извлечения минимального элемента мне нужно уменьшить значения некоторых элементов, а затем пузырь их. < /p>
Проблема, которую я сталкиваюсь, заключается в том, что я хочу найти элементы, значение которого должно быть уменьшено в куче в постоянное время < /strong>, затем уменьшите это значение, а затем пузырьте его.
После операции Heapify Heap_Vector v_h выглядит следующим образом: v_h = [1,2,7,4,3,16] . Когда я удаляю мин элемента 1 , тогда становится вектор кучи, [2,3,7,4,16] . Но прежде чем мы сделаем обмен и пузыри, скажем, я хочу изменить значения от 7 до 4, 16 на 4 и 4 на 3,5. Но я не уверен, где они будут в куче. Индексы значений элементов, которые необходимо уменьшить, будут даны в отношении исходного вектора V . Я выяснил, что мне нужно иметь вспомогательную структуру данных, которая может отслеживать индексы кучи в отношении исходного порядка элементов (вектор индекса кучи должен выглядеть как H_IV = [2,4,5,3,1,0] после Обновите индексы кучи, когда есть изменения, но я не могу сделать это. Благодаря всем, кто может привести меня в направлении, чтобы решить мою проблему.#ifndef minheap_hpp
#define minheap_hpp
#include
// #include "helper.h"
#include
class minheap
{
public:
std::vector vect;
std::vector heap_index;
void bubble_down(int index);
void bubble_up(int index);
void Heapify();
public:
minheap(const std::vector& input_vector);
minheap();
void insert(int value);
int get_min();
void delete_min();
void print_heap_vector();
};
#endif /* minheap_hpp */
< /code>
файл .cpp < /p>
#include "minheap.hpp"
minheap::minheap(const std::vector& input_vector) : vect(input_vector)
{
Heapify();
}
void minheap::Heapify()
{
int length = static_cast(vect.size());
// auto start = 0;
// for (auto i = 0; i < vect.size(); i++){
// heap_index.push_back(start);
// start++;
// }
for(int i=length/2-1; i>=0; --i)
{
bubble_down(i);
}
}
void minheap::bubble_down(int index)
{
int length = static_cast(vect.size());
int leftChildIndex = 2*index + 1;
int rightChildIndex = 2*index + 2;
if(leftChildIndex >= length){
return;
}
int minIndex = index;
if(vect[index] > vect[leftChildIndex])
{
minIndex = leftChildIndex;
}
if((rightChildIndex < length) && (vect[minIndex] > vect[rightChildIndex]))
{
minIndex = rightChildIndex;
}
if(minIndex != index)
{
std::swap(vect[index], vect[minIndex]);
// std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/55313214/how-to-create-an-auxiliary-data-structure-to-keep-track-of-heap-indices-in-a-min[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия