У меня есть следующий массив. Как я могу проверить, содержит ли массив, содержащий n элементов, 0 минутную кучу ? Как проверить, является ли массив мини-кучей?
ответ
Поскольку ваш индекс начинается с 1, (индекс 0 содержит 0 - почему?), Вы можете определить индекс детей данного узла, как показано ниже:
- Пусть индекс данного узла быть
i
- Индекс
i
'левого ребенка s:2i
- Индекс
i
' правого ребенка s:2i + 1
Таким образом, для каждого узла вы можете легко проверить, что оба ребенка больше самого узла.
Некоторым людям нравится вводить корень в индекс 1. Они говорят, что это по соображениям производительности (исключает дополнительный добавление при вычислении левого дочернего элемента и удаляет вычитание при вычислении родителя), но я сделал сравнение производительности: никаких значимых разница. Недостатком является то, что он вызывает неучтенные ошибки fencepost среди C-подобных языковых программистов. Я думаю, что основная причина, по которой люди это делают, заключается в том, что Седжвик написал книгу алгоритмов в 1983 году, и все его примеры были в Паскале с 1-мя массивами. C переводы его примеров Паскаля распространены и сегодня. –
is_heap
- большое предложение. Вам просто нужно использовать правильный компаратор. И вы можете даже использовать его с 1 на основе индексации с итераторы, без особых усилий:
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
int main()
{
std::vector<int> v {0, 5, 9, 11, 14, 18, 19 };
std::cout << std::is_heap(
v.begin()+1, // off by 1
v.end(),
std::greater<int>() // std::less is used by default for max-heap
);
}
Знакомый поиск в ширину (BFS) также могут быть применены, чтобы проверить дерево является минимальной/максимальной кучи или нет.
#include <iostream>
#include <queue>
int main() {
int tree[] = {5, 9, 11, 14, 18, 19, 21, 33, 17, 27};
int size = 10;
std::queue <int> q;
q.push(0);
bool flag = true;
while(!q.empty()) {
int x = q.front();
q.pop();
int left = 2*x+1, right = 2*x+2; // 0-based indexing used here
if(left < size) { // check if left child exists or not.
q.push(left);
// check value at parent is less than child or not.
if(tree[x] > tree[left]) {
flag = false;
break;
}
}
if(right < size) { // check whether right child exists or not.
q.push(right);
if(tree[x] > tree[right]) { // check value of parent less than child.
flag = false;
break;
}
}
}
if(flag)
std::cout << "It is minimum heap.\n";
else
std::cout << "Not a minimum heap.\n";
return 0;
}
Идея аналогична идее wookie919.
- 1. Как проверить, является ли массив массив массивным?
- 2. проверить, является ли массив многомерным
- 3. Как проверить, является ли массив строк нулевым?
- 4. Как проверить, является ли массив многомерным?
- 5. Как проверить, является ли массив многомерным? (JQuery)
- 6. Как проверить, является ли массив пустым/пустым?
- 7. Как проверить объект JSON, является ли массив
- 8. Как проверить, является ли массив многомерным
- 9. проверить, является ли массив значением подмножества запроса?
- 10. Лучший способ проверить, является ли массив числовым
- 11. Проверить, является ли значение в массив
- 12. проверить, является ли массив numpy массив с маской размером
- 13. Как проверить, содержит ли массив пустой массив?
- 14. Как проверить, является ли массив пустой или пустой?
- 15. Как проверить, не является ли 2D-массив вне границ?
- 16. как проверить, является ли массив emty или полным
- 17. Как проверить, является ли массив целым или нет?
- 18. Как проверить, является ли многомерный массив пустым или нет?
- 19. Как проверить, является ли входной массив последовательным образом или нет?
- 20. Как проверить, не является ли уникальный массив в PHP?
- 21. Как быстро проверить, является ли массив совпадающим с использованием MATLAB
- 22. Как проверить, является ли массив multiselect пустым в javascript?
- 23. Как проверить, является ли java.lang.reflect.Type является Enum
- 24. Как проверить, является ли эквивалентен
- 25. Как проверить, содержит ли массив другой массив?
- 26. Как проверить, пуст ли массив?
- 27. Как проверить, пуст ли массив?
- 28. Как проверить, пуст ли массив?
- 29. Как проверить, является ли объект строкой?
- 30. Как проверить, является ли объект массивом объектов
http://stackoverflow.com/questions/4157159/algorithm-for-checking-if-an-array-with-n-elements-is-a-minimum-heap См. Это. –
Вы ищете ['std :: is_heap'] (http://en.cppreference.com/w/cpp/algorithm/is_heap)? –
Дети узла i находятся в точке 2i и 2i + 1. Поэтому проверьте [2i]> = a [i] и [2i + 1]> = a [i], потому что это свойство кучи: дети по меньшей мере такие же большие, как их родители. – Gene