Tôi có mảng sau. Làm thế nào tôi có thể kiểm tra xem mảng có chứa các phần tử n là một heap tối thiểu ? Làm thế nào để kiểm tra xem mảng là một đống tối thiểu?
Trả lời
Kể từ khi chỉ số của bạn bắt đầu từ 1, (chỉ số 0 chứa 0 - tại sao?), Bạn có thể xác định các chỉ số của con cái một nút cho trước như sau:
- Hãy để cho chỉ số của các nút cho trước được
i
- Index của
i
'con trái s:2i
- Index của
i
' con phải s:2i + 1
Vì vậy, đối với mỗi nút, bạn có thể dễ dàng kiểm tra xem cả hai trẻ em có lớn hơn chính nút đó hay không.
Một số người thích đặt thư mục gốc vào chỉ mục 1. Họ cho rằng đó là vì lý do hiệu suất (loại bỏ thêm một khi tính toán con trái, và loại bỏ một phép trừ khi tính toán cha mẹ), nhưng tôi đã thực hiện so sánh hiệu suất: không có ý nghĩa Sự khác biệt. Nhược điểm là nó gây ra lỗi hàng rào vô số trong số các lập trình viên ngôn ngữ giống như C. Tôi nghĩ lý do chính mà mọi người làm là vì Sedgewick đã viết một cuốn sách Thuật toán vào năm 1983, và tất cả các ví dụ của ông đều ở trong Pascal, với các mảng dựa trên 1. Bản dịch C của các ví dụ Pascal của anh ta rất phổ biến ngay cả ngày nay. –
is_heap
là một đề xuất tuyệt vời. Bạn chỉ cần sử dụng so sánh thích hợp. Và thậm chí bạn có thể sử dụng nó với chỉ mục 1-based của bạn với vòng lặp, dễ dàng:
#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
);
}
Các quen Chiều rộng tìm kiếm đầu tiên (BFS) cũng có thể được áp dụng để kiểm tra xem cây là một tối thiểu/đống tối đa hay không.
#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;
}
Ý tưởng tương tự như ý tưởng của wookie919.
- 1. đống tối thiểu trong python
- 2. Làm thế nào để kiểm tra xem một mảng byte là một hình ảnh hợp lệ?
- 3. Làm thế nào để kiểm tra xem một mảng là 2D
- 4. Làm thế nào tôi có thể kiểm tra xem một mảng là null/empty?
- 5. Làm thế nào để kiểm tra xem một biến là Array hoặc Object?
- 6. Kiểm tra xem một biến là một mảng
- 7. Làm thế nào để kiểm tra xem một phần tử trong mảng tồn tại trong Java
- 8. làm thế nào để kiểm tra nếu một đối tượng clojure là một mảng byte?
- 9. Làm thế nào để kiểm tra xem một loại là một typedef int
- 10. Làm thế nào để kiểm tra xem một chuỗi là một uniqueidentifier?
- 11. Cách kiểm tra xem một mảng có trống không?
- 12. PostgreSQL: Làm thế nào để thực hiện cardinality tối thiểu?
- 13. Làm thế nào để tạo ra một X509Certificate2 giả tối thiểu?
- 14. Làm thế nào để kiểm tra xem một Datatable là Null hoặc Không có gì
- 15. Làm thế nào để kiểm tra xem một sampler là null trong glsl?
- 16. Làm thế nào để kiểm tra xem hai NSDates là từ cùng một ngày
- 17. MVC3 Làm thế nào để kiểm tra xem HttpPostedFileBase là một hình ảnh
- 18. Làm thế nào để kiểm tra xem một đôi là null?
- 19. Làm thế nào để kiểm tra xem một loại là chuỗi trong C#?
- 20. Làm thế nào để kiểm tra xem hệ thống là FreeBSD trong một kịch bản python?
- 21. làm thế nào để kiểm tra xem một file jar là hợp lệ?
- 22. Trong Python, làm thế nào để kiểm tra xem một dòng là cuối cùng?
- 23. Làm thế nào để kiểm tra xem biến là một lớp cụ thể trong python?
- 24. Làm thế nào để kiểm tra xem một biến hoặc đối tượng là không xác định?
- 25. Làm thế nào để kiểm tra xem một struct là NULL trong C hoặc C++
- 26. Làm thế nào để kiểm tra xem T là một loại tổng hợp?
- 27. Làm thế nào để kiểm tra xem một hệ thống là endian lớn hay ít endian?
- 28. Làm thế nào để kiểm tra xem một kiểu generic là nil trong Swift
- 29. Django: Làm thế nào để kiểm tra xem widget trường là hộp kiểm trong mẫu?
- 30. Làm thế nào để xem nếu một phần tử là null trong một mảng trong C?
http://stackoverflow.com/questions/4157159/algorithm-for-checking-if-an-array-with-n-elements-is-a-minimum-heap Hãy tham khảo phần này. –
Bạn đang tìm kiếm ['std :: is_heap'] (http://en.cppreference.com/w/cpp/algorithm/is_heap)? –
Con của nút i ở 2i và 2i + 1. Vì vậy, hãy xác minh [2i]> = a [i] và [2i + 1]> = a [i] vì đó là thuộc tính heap: trẻ em ít nhất cũng lớn như cha mẹ của chúng. – Gene