Một đống , còn được gọi là hàng đợi ưu tiên, là một kiểu dữ liệu trừu tượng. Về mặt khái niệm, nó là một cây nhị phân nơi con của mọi nút nhỏ hơn hoặc bằng chính nút đó. (Giả sử đó là một đống tối đa.) Khi một phần tử được đẩy hoặc bật, heap sắp xếp lại chính nó để phần tử lớn nhất là phần tử tiếp theo được bật lên. Nó có thể dễ dàng được thực hiện như một cây hoặc như một mảng.
Thách thức của bạn, nếu bạn chọn chấp nhận nó, là xác định xem một mảng có phải là một đống hợp lệ hay không. Một mảng ở dạng heap nếu con của mọi phần tử nhỏ hơn hoặc bằng chính phần tử đó. Lấy mảng sau đây làm ví dụ:
[90, 15, 10, 7, 12, 2]
Thực sự, đây là một cây nhị phân được sắp xếp dưới dạng một mảng. Điều này là do mọi yếu tố có con. 90 có hai con, 15 và 10.
15, 10,
[(90), 7, 12, 2]
15 cũng có con, 7 và 12:
7, 12,
[90, (15), 10, 2]
10 có con:
2
[90, 15, (10), 7, 12, ]
và yếu tố tiếp theo cũng sẽ là một đứa trẻ 10 tuổi, ngoại trừ việc không có phòng. 7, 12 và 2 tất cả cũng sẽ có con nếu mảng đủ dài. Đây là một ví dụ khác về một đống:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Và đây là một hình ảnh trực quan của cây mà mảng trước tạo ra:
Chỉ trong trường hợp điều này không đủ rõ ràng, đây là công thức rõ ràng để có được phần tử con của phần tử thứ i
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Bạn phải lấy một mảng không trống làm đầu vào và đầu ra một giá trị trung thực nếu mảng đó theo thứ tự heap và một giá trị giả khác. Đây có thể là một heap 0 chỉ mục, hoặc heap 1 chỉ mục miễn là bạn chỉ định định dạng chương trình / chức năng của bạn mong đợi. Bạn có thể cho rằng tất cả các mảng sẽ chỉ chứa các số nguyên dương. Bạn không được sử dụng bất kỳ nội dung heap nào. Điều này bao gồm, nhưng không giới hạn
- Các hàm xác định nếu một mảng ở dạng heap
- Các hàm chuyển đổi một mảng thành một đống hoặc thành dạng heap
- Các hàm lấy một mảng làm đầu vào và trả về cấu trúc dữ liệu heap
Bạn có thể sử dụng tập lệnh python này để xác minh xem một mảng có ở dạng heap hay không (0 được lập chỉ mục):
def is_heap(l):
for head in range(0, len(l)):
c1, c2 = head * 2 + 1, head * 2 + 2
if c1 < len(l) and l[head] < l[c1]:
return False
if c2 < len(l) and l[head] < l[c2]:
return False
return True
Kiểm tra IO:
Tất cả các đầu vào này sẽ trả về True:
[90, 15, 10, 7, 12, 2]
[93, 15, 87, 7, 15, 5]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[100, 19, 36, 17, 3, 25, 1, 2, 7]
[5, 5, 5, 5, 5, 5, 5, 5]
Và tất cả các đầu vào này sẽ trả về Sai:
[4, 5, 5, 5, 5, 5, 5, 5]
[90, 15, 10, 7, 12, 11]
[1, 2, 3, 4, 5]
[4, 8, 15, 16, 23, 42]
[2, 1, 3]
Như thường lệ, đây là môn đánh gôn, vì vậy các sơ hở tiêu chuẩn được áp dụng và câu trả lời ngắn nhất bằng byte sẽ thắng!
[3, 2, 1, 1]
thì sao?