parent
, left
및 right
절차는 간단합니다 (i
에) 주어진 parent
, left
및 right
요소를 얻기위한 계산.
부모이 i/2
왼쪽의 바닥입니다 2i
오른쪽2i + 1
이 제공 한 예를 살펴입니다. 일반적으로 배열은 0을 기반으로하지만 예제는 1을 기준으로합니다.
배열이 있으니 A라고 부릅니다. 여기서 A = [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
입니다.
의 우리가 위의 계산을 사용하여 10 입니다 A[3]
에서 찾고 있다고 가정 해 봅시다, A[3]
의 부모는 A[1]
이다 (16) A[3]
의 왼쪽 아이가 9 A[3]
의 권리 아이입니다 A[6]
입니다 i가 하나의 비트 위치만큼 왼쪽으로 대부분의 시스템에서 3
이다 A[7]
는 LEFT 절차는 단순히 이진 표현을 이동함으로써 하나의 명령에 2I를 계산할 수 .
마찬가지로 RIGHT 프로시 저는 1 비트 위치만큼 왼쪽의 2 진 표현을 시프트 한 다음 하위 비트로 1을 더함으로써 2i + 1을 빠르게 계산할 수 있습니다. PARENT 프로시 저는 i를 오른쪽으로 1 비트 이동시켜 [i/2]를 계산할 수 있습니다. heaport의 좋은 구현은 종종 이러한 절차를 "매크로"또는 "인라인"절차로 구현합니다.
이것은 프로세서 수준에서 이러한 기능의 복잡성을 설명합니다. 요점은 parent
, left
및 right
은 일반적으로 프로세서에서 하나 또는 두 개의 명령으로 실행될 수 있다는 것입니다.
inline procedures에 대한 의견은 컴파일러 최적화를 설명합니다. 컴파일러는 대개 어셈블리 코드를 작성하는 경우 인간보다 더 많은 어셈블리 명령어를 생성합니다. 따라서이 주석은 올바른 컴파일러 최적화를 사용할 수 있다고 가정하고 (parent
, left
및 right
) 프로 시저를 단일 (또는 몇 가지) 명령으로 컴파일 할 수 있다는 것을 말하는 것입니다.
이러한 절차가 실제로 프로세서 수준에서 실행되는 방법을 이해하려는 경우 약 bit shifting을 읽거나 다른 대답을 읽을 수 있습니다.
임의 선택 : 실제로 CLRS에서 알고리즘 학습을 권장하지는 않습니다. 알고리즘에 관한 훌륭한 * 두 번째 책이지만, 많은 설명은 기술적이며 수학적입니다. 과거에 사용해 왔던 Kleinberg와 Tardos의 "알고리즘 설계"를 확인해보고 더 나은 일이 동기가된다고 생각할 수도 있습니다. – templatetypedef