우선 순위 큐라고도 하는 힙 은 추상 데이터 유형입니다. 개념적으로, 이것은 모든 노드의 자식이 노드 자체보다 작거나 같은 이진 트리입니다. (최대 힙이라고 가정합니다.) 요소를 밀거나 튀어 나오면 힙이 다시 정렬되므로 가장 큰 요소가 다음으로 표시됩니다. 트리 또는 배열로 쉽게 구현할 수 있습니다.
수용하기로 선택한 경우 배열이 유효한 힙인지 확인해야합니다. 모든 요소의 자식이 요소 자체보다 작거나 같은 경우 배열은 힙 형식입니다. 다음 배열을 예로 들어 보겠습니다.
[90, 15, 10, 7, 12, 2]
실제로 이것은 배열 형태로 배열 된 이진 트리입니다. 모든 요소에 자식이 있기 때문입니다. 90에는 15와 10의 두 자녀가 있습니다.
15, 10,
[(90), 7, 12, 2]
15에는 또한 7 세와 12 세의 자녀가 있습니다.
7, 12,
[90, (15), 10, 2]
10 명의 자녀가 있습니다 :
2
[90, 15, (10), 7, 12, ]
그리고 다음 요소는 공간이 없다는 것을 제외하고는 10의 자녀입니다. 배열이 충분히 길면 7, 12 및 2도 자식을 갖습니다. 다음은 힙의 다른 예입니다.
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
그리고 이전 배열이 만드는 트리의 시각화는 다음과 같습니다.
이것이 명확하지 않은 경우를 대비하여 i 번째 요소의 자식을 얻는 명시 적 공식은 다음과 같습니다.
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
비어 있지 않은 배열을 입력으로 가져 와서 배열이 힙 순서이면 정확한 값을 출력하고 그렇지 않으면 거짓 값을 출력해야합니다. 프로그램 / 함수가 예상하는 형식을 지정하는 한 0 인덱싱 된 힙이거나 1 인덱싱 된 힙일 수 있습니다. 모든 배열은 양의 정수만 포함한다고 가정 할 수 있습니다. 당신은 할 수있다힙 내장을 사용할 없습니다 . 여기에는 다음이 포함되지만 이에 국한되지 않습니다.
- 배열이 힙 형태인지 판별하는 함수
- 배열을 힙 또는 힙 형식으로 변환하는 함수
- 배열을 입력으로 받아서 힙 데이터 구조를 반환하는 함수
이 파이썬 스크립트를 사용하여 배열이 힙 형태인지 아닌지를 확인할 수 있습니다 (0 인덱스 됨).
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
IO 테스트 :
이 모든 입력은 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]
그리고이 모든 입력은 False를 반환해야합니다.
[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]
평소와 같이, 이것은 코드 골프이므로 표준 허점이 적용되고 바이트 단위의 최단 답변이 이깁니다!
[3, 2, 1, 1]
습니까?