HEAP

Constant HEAP 

Source
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)数据结构