pub const HEAP: &str = "// stdlib/heap.aether\n// Aether \u{5806}\u{ff08}Heap\u{ff09}\u{6570}\u{636e}\u{7ed3}\u{6784}\u{5e93}\n// \u{5b9e}\u{73b0}\u{6700}\u{5c0f}\u{5806}\u{548c}\u{6700}\u{5927}\u{5806}\u{ff0c}\u{57fa}\u{4e8e}\u{6570}\u{7ec4}\u{7684}\u{5b8c}\u{5168}\u{4e8c}\u{53c9}\u{6811}\n\n// ==================== \u{8f85}\u{52a9}\u{51fd}\u{6570} ====================\n\n// \u{83b7}\u{53d6}\u{7236}\u{8282}\u{70b9}\u{7d22}\u{5f15}\nFunc HEAP_PARENT(INDEX) {\n Return FLOOR((INDEX - 1) / 2)\n}\n\n// \u{83b7}\u{53d6}\u{5de6}\u{5b50}\u{8282}\u{70b9}\u{7d22}\u{5f15}\nFunc HEAP_LEFT_CHILD(INDEX) {\n Return (2 * INDEX + 1)\n}\n\n// \u{83b7}\u{53d6}\u{53f3}\u{5b50}\u{8282}\u{70b9}\u{7d22}\u{5f15}\nFunc HEAP_RIGHT_CHILD(INDEX) {\n Return (2 * INDEX + 2)\n}\n\n// \u{4ea4}\u{6362}\u{6570}\u{7ec4}\u{4e2d}\u{4e24}\u{4e2a}\u{5143}\u{7d20}\u{7684}\u{4f4d}\u{7f6e}\nFunc HEAP_SWAP(ARR, I, J) {\n Set NEW_ARR []\n Set K 0\n Set LEN_ LEN(ARR)\n \n While (K < LEN_) {\n If (K == I) {\n Set NEW_ARR PUSH(NEW_ARR, ARR[J])\n } Else {\n If (K == J) {\n Set NEW_ARR PUSH(NEW_ARR, ARR[I])\n } Else {\n Set NEW_ARR PUSH(NEW_ARR, ARR[K])\n }\n }\n Set K (K + 1)\n }\n \n Return NEW_ARR\n}\n\n// ==================== \u{521b}\u{5efa}\u{5806} ====================\n\n// \u{521b}\u{5efa}\u{4e00}\u{4e2a}\u{7a7a}\u{7684}\u{6700}\u{5c0f}\u{5806}\nFunc MIN_HEAP_NEW() {\n Return []\n}\n\n// \u{521b}\u{5efa}\u{4e00}\u{4e2a}\u{7a7a}\u{7684}\u{6700}\u{5927}\u{5806}\nFunc MAX_HEAP_NEW() {\n Return []\n}\n\n// \u{4ece}\u{6570}\u{7ec4}\u{521b}\u{5efa}\u{6700}\u{5c0f}\u{5806}\nFunc MIN_HEAP_FROM_ARRAY(ARR) {\n Set HEAP ARR\n Set LEN_ LEN(HEAP)\n Set I FLOOR(LEN_ / 2 - 1)\n \n While (I >= 0) {\n Set HEAP MIN_HEAP_SIFT_DOWN(HEAP, I)\n Set I (I - 1)\n }\n \n Return HEAP\n}\n\n// \u{4ece}\u{6570}\u{7ec4}\u{521b}\u{5efa}\u{6700}\u{5927}\u{5806}\nFunc MAX_HEAP_FROM_ARRAY(ARR) {\n Set HEAP ARR\n Set LEN_ LEN(HEAP)\n Set I FLOOR(LEN_ / 2 - 1)\n \n While (I >= 0) {\n Set HEAP MAX_HEAP_SIFT_DOWN(HEAP, I)\n Set I (I - 1)\n }\n \n Return HEAP\n}\n\n// ==================== \u{6700}\u{5c0f}\u{5806}\u{64cd}\u{4f5c} ====================\n\n// \u{5411}\u{6700}\u{5c0f}\u{5806}\u{63d2}\u{5165}\u{5143}\u{7d20}\nFunc MIN_HEAP_INSERT(HEAP, VALUE) {\n Set NEW_HEAP PUSH(HEAP, VALUE)\n Return MIN_HEAP_SIFT_UP(NEW_HEAP, LEN(NEW_HEAP) - 1)\n}\n\n// \u{4ece}\u{6700}\u{5c0f}\u{5806}\u{63d0}\u{53d6}\u{6700}\u{5c0f}\u{503c}\n// \u{8fd4}\u{56de} {\"heap\": \u{65b0}\u{5806}, \"value\": \u{6700}\u{5c0f}\u{503c}}\nFunc MIN_HEAP_EXTRACT(HEAP) {\n If (LEN(HEAP) == 0) {\n Return {\"heap\": [], \"value\": Null}\n }\n \n If (LEN(HEAP) == 1) {\n Return {\"heap\": [], \"value\": HEAP[0]}\n }\n \n Set MIN_VAL HEAP[0]\n Set LEN_ LEN(HEAP)\n \n // \u{5c06}\u{6700}\u{540e}\u{4e00}\u{4e2a}\u{5143}\u{7d20}\u{79fb}\u{5230}\u{6839}\n Set NEW_HEAP []\n Set NEW_HEAP PUSH(NEW_HEAP, HEAP[LEN_ - 1])\n Set I 1\n \n While (I < (LEN_ - 1)) {\n Set NEW_HEAP PUSH(NEW_HEAP, HEAP[I])\n Set I (I + 1)\n }\n \n Set NEW_HEAP MIN_HEAP_SIFT_DOWN(NEW_HEAP, 0)\n \n Return {\"heap\": NEW_HEAP, \"value\": MIN_VAL}\n}\n\n// \u{67e5}\u{770b}\u{6700}\u{5c0f}\u{5806}\u{7684}\u{6700}\u{5c0f}\u{503c}\u{ff08}\u{4e0d}\u{79fb}\u{9664}\u{ff09}\nFunc MIN_HEAP_PEEK(HEAP) {\n If (LEN(HEAP) == 0) {\n Return Null\n }\n Return HEAP[0]\n}\n\n// \u{6700}\u{5c0f}\u{5806}\u{4e0a}\u{6d6e}\u{64cd}\u{4f5c}\nFunc MIN_HEAP_SIFT_UP(HEAP, INDEX) {\n If (INDEX <= 0) {\n Return HEAP\n }\n \n Set PARENT HEAP_PARENT(INDEX)\n \n If (HEAP[INDEX] < HEAP[PARENT]) {\n Set NEW_HEAP HEAP_SWAP(HEAP, INDEX, PARENT)\n Set RESULT MIN_HEAP_SIFT_UP(NEW_HEAP, PARENT)\n Return RESULT\n }\n \n Return HEAP\n}\n\n// \u{6700}\u{5c0f}\u{5806}\u{4e0b}\u{6c89}\u{64cd}\u{4f5c}\nFunc MIN_HEAP_SIFT_DOWN(HEAP, INDEX) {\n Set LEN_ LEN(HEAP)\n Set SMALLEST INDEX\n Set LEFT HEAP_LEFT_CHILD(INDEX)\n Set RIGHT HEAP_RIGHT_CHILD(INDEX)\n \n // \u{4f7f}\u{7528}\u{5d4c}\u{5957} If \u{907f}\u{514d}\u{77ed}\u{8def}\u{6c42}\u{503c}\u{95ee}\u{9898}\n If (LEFT < LEN_) {\n If (HEAP[LEFT] < HEAP[SMALLEST]) {\n Set SMALLEST LEFT\n }\n }\n \n If (RIGHT < LEN_) {\n If (HEAP[RIGHT] < HEAP[SMALLEST]) {\n Set SMALLEST RIGHT\n }\n }\n \n If (SMALLEST != INDEX) {\n Set NEW_HEAP HEAP_SWAP(HEAP, INDEX, SMALLEST)\n Set RESULT MIN_HEAP_SIFT_DOWN(NEW_HEAP, SMALLEST)\n Return RESULT\n }\n \n Return HEAP\n}\n\n// ==================== \u{6700}\u{5927}\u{5806}\u{64cd}\u{4f5c} ====================\n\n// \u{5411}\u{6700}\u{5927}\u{5806}\u{63d2}\u{5165}\u{5143}\u{7d20}\nFunc MAX_HEAP_INSERT(HEAP, VALUE) {\n Set NEW_HEAP PUSH(HEAP, VALUE)\n Return MAX_HEAP_SIFT_UP(NEW_HEAP, LEN(NEW_HEAP) - 1)\n}\n\n// \u{4ece}\u{6700}\u{5927}\u{5806}\u{63d0}\u{53d6}\u{6700}\u{5927}\u{503c}\n// \u{8fd4}\u{56de} {\"heap\": \u{65b0}\u{5806}, \"value\": \u{6700}\u{5927}\u{503c}}\nFunc MAX_HEAP_EXTRACT(HEAP) {\n If (LEN(HEAP) == 0) {\n Return {\"heap\": [], \"value\": Null}\n }\n \n If (LEN(HEAP) == 1) {\n Return {\"heap\": [], \"value\": HEAP[0]}\n }\n \n Set MAX_VAL HEAP[0]\n Set LEN_ LEN(HEAP)\n \n // \u{5c06}\u{6700}\u{540e}\u{4e00}\u{4e2a}\u{5143}\u{7d20}\u{79fb}\u{5230}\u{6839}\n Set NEW_HEAP []\n Set NEW_HEAP PUSH(NEW_HEAP, HEAP[LEN_ - 1])\n Set I 1\n \n While (I < (LEN_ - 1)) {\n Set NEW_HEAP PUSH(NEW_HEAP, HEAP[I])\n Set I (I + 1)\n }\n \n Set NEW_HEAP MAX_HEAP_SIFT_DOWN(NEW_HEAP, 0)\n \n Return {\"heap\": NEW_HEAP, \"value\": MAX_VAL}\n}\n\n// \u{67e5}\u{770b}\u{6700}\u{5927}\u{5806}\u{7684}\u{6700}\u{5927}\u{503c}\u{ff08}\u{4e0d}\u{79fb}\u{9664}\u{ff09}\nFunc MAX_HEAP_PEEK(HEAP) {\n If (LEN(HEAP) == 0) {\n Return Null\n }\n Return HEAP[0]\n}\n\n// \u{6700}\u{5927}\u{5806}\u{4e0a}\u{6d6e}\u{64cd}\u{4f5c}\nFunc MAX_HEAP_SIFT_UP(HEAP, INDEX) {\n If (INDEX <= 0) {\n Return HEAP\n }\n \n Set PARENT HEAP_PARENT(INDEX)\n \n If (HEAP[INDEX] > HEAP[PARENT]) {\n Set NEW_HEAP HEAP_SWAP(HEAP, INDEX, PARENT)\n Set RESULT MAX_HEAP_SIFT_UP(NEW_HEAP, PARENT)\n Return RESULT\n }\n \n Return HEAP\n}\n\n// \u{6700}\u{5927}\u{5806}\u{4e0b}\u{6c89}\u{64cd}\u{4f5c}\nFunc MAX_HEAP_SIFT_DOWN(HEAP, INDEX) {\n Set LEN_ LEN(HEAP)\n Set LARGEST INDEX\n Set LEFT HEAP_LEFT_CHILD(INDEX)\n Set RIGHT HEAP_RIGHT_CHILD(INDEX)\n \n // \u{4f7f}\u{7528}\u{5d4c}\u{5957} If \u{907f}\u{514d}\u{77ed}\u{8def}\u{6c42}\u{503c}\u{95ee}\u{9898}\n If (LEFT < LEN_) {\n If (HEAP[LEFT] > HEAP[LARGEST]) {\n Set LARGEST LEFT\n }\n }\n \n If (RIGHT < LEN_) {\n If (HEAP[RIGHT] > HEAP[LARGEST]) {\n Set LARGEST RIGHT\n }\n }\n \n If (LARGEST != INDEX) {\n Set NEW_HEAP HEAP_SWAP(HEAP, INDEX, LARGEST)\n Set RESULT MAX_HEAP_SIFT_DOWN(NEW_HEAP, LARGEST)\n Return RESULT\n }\n \n Return HEAP\n}\n\n// ==================== \u{901a}\u{7528}\u{5806}\u{64cd}\u{4f5c} ====================\n\n// \u{83b7}\u{53d6}\u{5806}\u{7684}\u{5927}\u{5c0f}\nFunc HEAP_SIZE(HEAP) {\n Return LEN(HEAP)\n}\n\n// \u{68c0}\u{67e5}\u{5806}\u{662f}\u{5426}\u{4e3a}\u{7a7a}\nFunc HEAP_IS_EMPTY(HEAP) {\n Return LEN(HEAP) == 0\n}\n\n// \u{6e05}\u{7a7a}\u{5806}\nFunc HEAP_CLEAR() {\n Return []\n}\n\n// \u{5c06}\u{5806}\u{8f6c}\u{6362}\u{4e3a}\u{6570}\u{7ec4}\nFunc HEAP_TO_ARRAY(HEAP) {\n Return HEAP\n}\n\n// ==================== \u{5806}\u{6392}\u{5e8f} ====================\n\n// \u{4f7f}\u{7528}\u{6700}\u{5c0f}\u{5806}\u{8fdb}\u{884c}\u{5347}\u{5e8f}\u{6392}\u{5e8f}\nFunc HEAP_SORT_ASC(ARR) {\n Set HEAP MIN_HEAP_FROM_ARRAY(ARR)\n Set RESULT []\n \n While (!HEAP_IS_EMPTY(HEAP)) {\n Set EXTRACT_RESULT MIN_HEAP_EXTRACT(HEAP)\n Set HEAP EXTRACT_RESULT[\"heap\"]\n Set RESULT PUSH(RESULT, EXTRACT_RESULT[\"value\"])\n }\n \n Return RESULT\n}\n\n// \u{4f7f}\u{7528}\u{6700}\u{5927}\u{5806}\u{8fdb}\u{884c}\u{964d}\u{5e8f}\u{6392}\u{5e8f}\nFunc HEAP_SORT_DESC(ARR) {\n Set HEAP MAX_HEAP_FROM_ARRAY(ARR)\n Set RESULT []\n \n While (!HEAP_IS_EMPTY(HEAP)) {\n Set EXTRACT_RESULT MAX_HEAP_EXTRACT(HEAP)\n Set HEAP EXTRACT_RESULT[\"heap\"]\n Set RESULT PUSH(RESULT, EXTRACT_RESULT[\"value\"])\n }\n \n Return RESULT\n}\n\n// ==================== \u{9ad8}\u{7ea7}\u{64cd}\u{4f5c} ====================\n\n// \u{83b7}\u{53d6}\u{6700}\u{5c0f}\u{5806}\u{7684}\u{524d}K\u{4e2a}\u{6700}\u{5c0f}\u{5143}\u{7d20}\nFunc MIN_HEAP_GET_K_MIN(HEAP, K) {\n Set RESULT []\n Set TEMP_HEAP HEAP\n Set COUNT 0\n \n While (COUNT < K && !HEAP_IS_EMPTY(TEMP_HEAP)) {\n Set EXTRACT_RESULT MIN_HEAP_EXTRACT(TEMP_HEAP)\n Set TEMP_HEAP EXTRACT_RESULT[\"heap\"]\n Set RESULT PUSH(RESULT, EXTRACT_RESULT[\"value\"])\n Set COUNT (COUNT + 1)\n }\n \n Return RESULT\n}\n\n// \u{83b7}\u{53d6}\u{6700}\u{5927}\u{5806}\u{7684}\u{524d}K\u{4e2a}\u{6700}\u{5927}\u{5143}\u{7d20}\nFunc MAX_HEAP_GET_K_MAX(HEAP, K) {\n Set RESULT []\n Set TEMP_HEAP HEAP\n Set COUNT 0\n \n While (COUNT < K && !HEAP_IS_EMPTY(TEMP_HEAP)) {\n Set EXTRACT_RESULT MAX_HEAP_EXTRACT(TEMP_HEAP)\n Set TEMP_HEAP EXTRACT_RESULT[\"heap\"]\n Set RESULT PUSH(RESULT, EXTRACT_RESULT[\"value\"])\n Set COUNT (COUNT + 1)\n }\n \n Return RESULT\n}\n\n// \u{9a8c}\u{8bc1}\u{662f}\u{5426}\u{4e3a}\u{6709}\u{6548}\u{7684}\u{6700}\u{5c0f}\u{5806}\nFunc MIN_HEAP_IS_VALID(HEAP) {\n Set LEN_ LEN(HEAP)\n Set I 0\n \n While (I < LEN_) {\n Set LEFT HEAP_LEFT_CHILD(I)\n Set RIGHT HEAP_RIGHT_CHILD(I)\n \n // \u{4f7f}\u{7528}\u{5d4c}\u{5957} If \u{907f}\u{514d}\u{77ed}\u{8def}\u{6c42}\u{503c}\u{95ee}\u{9898}\n If (LEFT < LEN_) {\n If (HEAP[LEFT] < HEAP[I]) {\n Return False\n }\n }\n \n If (RIGHT < LEN_) {\n If (HEAP[RIGHT] < HEAP[I]) {\n Return False\n }\n }\n \n Set I (I + 1)\n }\n \n Return True\n}\n\n// \u{9a8c}\u{8bc1}\u{662f}\u{5426}\u{4e3a}\u{6709}\u{6548}\u{7684}\u{6700}\u{5927}\u{5806}\nFunc MAX_HEAP_IS_VALID(HEAP) {\n Set LEN_ LEN(HEAP)\n Set I 0\n \n While (I < LEN_) {\n Set LEFT HEAP_LEFT_CHILD(I)\n Set RIGHT HEAP_RIGHT_CHILD(I)\n \n // \u{4f7f}\u{7528}\u{5d4c}\u{5957} If \u{907f}\u{514d}\u{77ed}\u{8def}\u{6c42}\u{503c}\u{95ee}\u{9898}\n If (LEFT < LEN_) {\n If (HEAP[LEFT] > HEAP[I]) {\n Return False\n }\n }\n \n If (RIGHT < LEN_) {\n If (HEAP[RIGHT] > HEAP[I]) {\n Return False\n }\n }\n \n Set I (I + 1)\n }\n \n Return True\n}\n\n// \u{5c06}\u{6700}\u{5c0f}\u{5806}\u{8f6c}\u{6362}\u{4e3a}\u{5b57}\u{7b26}\u{4e32}\u{8868}\u{793a}\nFunc MIN_HEAP_TO_STRING(HEAP) {\n If (HEAP_IS_EMPTY(HEAP)) {\n Return \"MinHeap[]\"\n }\n \n Set RESULT \"MinHeap[\"\n Set LEN_ LEN(HEAP)\n Set I 0\n \n While (I < LEN_) {\n Set RESULT (RESULT + TO_STRING(HEAP[I]))\n If (I < (LEN_ - 1)) {\n Set RESULT (RESULT + \", \")\n }\n Set I (I + 1)\n }\n \n Set RESULT (RESULT + \"]\")\n Return RESULT\n}\n\n// \u{5c06}\u{6700}\u{5927}\u{5806}\u{8f6c}\u{6362}\u{4e3a}\u{5b57}\u{7b26}\u{4e32}\u{8868}\u{793a}\nFunc MAX_HEAP_TO_STRING(HEAP) {\n If (HEAP_IS_EMPTY(HEAP)) {\n Return \"MaxHeap[]\"\n }\n \n Set RESULT \"MaxHeap[\"\n Set LEN_ LEN(HEAP)\n Set I 0\n \n While (I < LEN_) {\n Set RESULT (RESULT + TO_STRING(HEAP[I]))\n If (I < (LEN_ - 1)) {\n Set RESULT (RESULT + \", \")\n }\n Set I (I + 1)\n }\n \n Set RESULT (RESULT + \"]\")\n Return RESULT\n}\n";Expand description
堆(Heap)数据结构