refactor: Replace 'poll' with 'pop' in Heap (#416)
@ -86,7 +86,7 @@ int push(maxHeap *h, int val) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 元素出堆 */
|
/* 元素出堆 */
|
||||||
int poll(maxHeap *h) {
|
int pop(maxHeap *h) {
|
||||||
// 判空处理
|
// 判空处理
|
||||||
if (isEmpty(h)) {
|
if (isEmpty(h)) {
|
||||||
printf("heap is empty!");
|
printf("heap is empty!");
|
||||||
@ -162,7 +162,7 @@ int main() {
|
|||||||
printHeap(heap->data, heap->size);
|
printHeap(heap->data, heap->size);
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
int top = poll(heap);
|
int top = pop(heap);
|
||||||
printf("\n堆顶元素 %d 出堆后\n", top);
|
printf("\n堆顶元素 %d 出堆后\n", top);
|
||||||
printHeap(heap->data, heap->size);
|
printHeap(heap->data, heap->size);
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ void testPush(priority_queue<int> &heap, int val)
|
|||||||
PrintUtil::printHeap(heap);
|
PrintUtil::printHeap(heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testPoll(priority_queue<int> &heap)
|
void testPop(priority_queue<int> &heap)
|
||||||
{
|
{
|
||||||
int val = heap.top();
|
int val = heap.top();
|
||||||
heap.pop();
|
heap.pop();
|
||||||
@ -43,11 +43,11 @@ int main()
|
|||||||
cout << "\n堆顶元素为 " << peek << endl;
|
cout << "\n堆顶元素为 " << peek << endl;
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
|
|
||||||
/* 获取堆大小 */
|
/* 获取堆大小 */
|
||||||
int size = maxHeap.size();
|
int size = maxHeap.size();
|
||||||
|
@ -96,7 +96,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 元素出堆 */
|
/* 元素出堆 */
|
||||||
void poll() {
|
void pop() {
|
||||||
// 判空处理
|
// 判空处理
|
||||||
if (empty()) {
|
if (empty()) {
|
||||||
throw out_of_range("堆为空");
|
throw out_of_range("堆为空");
|
||||||
@ -121,48 +121,35 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void testPush(MaxHeap maxHeap, int val) {
|
|
||||||
maxHeap.push(val);
|
|
||||||
cout << "\n添加元素 " << val << " 后" << endl;
|
|
||||||
maxHeap.print();
|
|
||||||
}
|
|
||||||
|
|
||||||
void testPop(MaxHeap maxHeap) {
|
|
||||||
int val = maxHeap.peek();
|
|
||||||
maxHeap.poll();
|
|
||||||
cout << "\n出堆元素为 " << val << endl;
|
|
||||||
maxHeap.print();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Driver Code */
|
/* Driver Code */
|
||||||
int main() {
|
int main() {
|
||||||
/* 初始化大顶堆 */
|
/* 初始化大顶堆 */
|
||||||
vector<int> vec{9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2};
|
vector<int> vec{9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2};
|
||||||
MaxHeap maxheap(vec);
|
MaxHeap maxHeap(vec);
|
||||||
cout << "\n输入列表并建堆后" << endl;
|
cout << "\n输入列表并建堆后" << endl;
|
||||||
maxheap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
/* 获取堆顶元素 */
|
/* 获取堆顶元素 */
|
||||||
int peek = maxheap.peek();
|
int peek = maxHeap.peek();
|
||||||
cout << "\n堆顶元素为 " << peek << endl;
|
cout << "\n堆顶元素为 " << peek << endl;
|
||||||
|
|
||||||
/* 元素入堆 */
|
/* 元素入堆 */
|
||||||
int val = 7;
|
int val = 7;
|
||||||
maxheap.push(val);
|
maxHeap.push(val);
|
||||||
cout << "\n元素 " << val << " 入堆后" << endl;
|
cout << "\n元素 " << val << " 入堆后" << endl;
|
||||||
maxheap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
peek = maxheap.peek();
|
peek = maxHeap.peek();
|
||||||
maxheap.poll();
|
maxHeap.pop();
|
||||||
cout << "\n堆顶元素 " << peek << " 出堆后" << endl;
|
cout << "\n堆顶元素 " << peek << " 出堆后" << endl;
|
||||||
maxheap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
/* 获取堆大小 */
|
/* 获取堆大小 */
|
||||||
int size = maxheap.size();
|
int size = maxHeap.size();
|
||||||
cout << "\n堆元素数量为 " << size << endl;
|
cout << "\n堆元素数量为 " << size << endl;
|
||||||
|
|
||||||
/* 判断堆是否为空 */
|
/* 判断堆是否为空 */
|
||||||
bool isEmpty = maxheap.empty();
|
bool isEmpty = maxHeap.empty();
|
||||||
cout << "\n堆是否为空 " << isEmpty << endl;
|
cout << "\n堆是否为空 " << isEmpty << endl;
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ public class heap
|
|||||||
PrintUtil.printHeap(heap);
|
PrintUtil.printHeap(heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPoll(PriorityQueue<int, int> heap)
|
public void testPop(PriorityQueue<int, int> heap)
|
||||||
{
|
{
|
||||||
int val = heap.Dequeue(); // 堆顶元素出堆
|
int val = heap.Dequeue(); // 堆顶元素出堆
|
||||||
Console.WriteLine($"\n堆顶元素 {val} 出堆后\n");
|
Console.WriteLine($"\n堆顶元素 {val} 出堆后\n");
|
||||||
@ -47,11 +47,11 @@ public class heap
|
|||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
// 出堆元素会形成一个从大到小的序列
|
// 出堆元素会形成一个从大到小的序列
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
|
|
||||||
/* 获取堆大小 */
|
/* 获取堆大小 */
|
||||||
int size = maxHeap.Count;
|
int size = maxHeap.Count;
|
||||||
|
@ -97,7 +97,7 @@ class MaxHeap
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 元素出堆 */
|
/* 元素出堆 */
|
||||||
public int poll()
|
public int pop()
|
||||||
{
|
{
|
||||||
// 判空处理
|
// 判空处理
|
||||||
if (isEmpty())
|
if (isEmpty())
|
||||||
@ -168,7 +168,7 @@ public class my_heap
|
|||||||
maxHeap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
peek = maxHeap.poll();
|
peek = maxHeap.pop();
|
||||||
Console.WriteLine($"堆顶元素 {peek} 出堆后");
|
Console.WriteLine($"堆顶元素 {peek} 出堆后");
|
||||||
maxHeap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ func TestMyHeap(t *testing.T) {
|
|||||||
maxHeap.print()
|
maxHeap.print()
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
peek = maxHeap.poll()
|
peek = maxHeap.pop()
|
||||||
fmt.Printf("\n堆顶元素 %d 出堆后\n", peek)
|
fmt.Printf("\n堆顶元素 %d 出堆后\n", peek)
|
||||||
maxHeap.print()
|
maxHeap.print()
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ func (h *maxHeap) siftUp(i int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 元素出堆 */
|
/* 元素出堆 */
|
||||||
func (h *maxHeap) poll() any {
|
func (h *maxHeap) pop() any {
|
||||||
// 判空处理
|
// 判空处理
|
||||||
if h.isEmpty() {
|
if h.isEmpty() {
|
||||||
fmt.Println("error")
|
fmt.Println("error")
|
||||||
|
@ -18,7 +18,7 @@ func levelOrder(root *TreeNode) []int {
|
|||||||
// 初始化一个切片,用于保存遍历序列
|
// 初始化一个切片,用于保存遍历序列
|
||||||
nums := make([]int, 0)
|
nums := make([]int, 0)
|
||||||
for queue.Len() > 0 {
|
for queue.Len() > 0 {
|
||||||
// poll
|
// 队首元素出队
|
||||||
node := queue.Remove(queue.Front()).(*TreeNode)
|
node := queue.Remove(queue.Front()).(*TreeNode)
|
||||||
// 保存结点值
|
// 保存结点值
|
||||||
nums = append(nums, node.Val)
|
nums = append(nums, node.Val)
|
||||||
|
@ -36,7 +36,7 @@ func ArrToTree(arr []any) *TreeNode {
|
|||||||
queue.PushBack(root)
|
queue.PushBack(root)
|
||||||
i := 0
|
i := 0
|
||||||
for queue.Len() > 0 {
|
for queue.Len() > 0 {
|
||||||
// poll
|
// 队首元素出队
|
||||||
node := queue.Remove(queue.Front()).(*TreeNode)
|
node := queue.Remove(queue.Front()).(*TreeNode)
|
||||||
i++
|
i++
|
||||||
if i < len(arr) {
|
if i < len(arr) {
|
||||||
|
@ -12,12 +12,12 @@ import java.util.*;
|
|||||||
|
|
||||||
public class heap {
|
public class heap {
|
||||||
public static void testPush(Queue<Integer> heap, int val) {
|
public static void testPush(Queue<Integer> heap, int val) {
|
||||||
heap.add(val); // 元素入堆
|
heap.offer(val); // 元素入堆
|
||||||
System.out.format("\n元素 %d 入堆后\n", val);
|
System.out.format("\n元素 %d 入堆后\n", val);
|
||||||
PrintUtil.printHeap(heap);
|
PrintUtil.printHeap(heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void testPoll(Queue<Integer> heap) {
|
public static void testPop(Queue<Integer> heap) {
|
||||||
int val = heap.poll(); // 堆顶元素出堆
|
int val = heap.poll(); // 堆顶元素出堆
|
||||||
System.out.format("\n堆顶元素 %d 出堆后\n", val);
|
System.out.format("\n堆顶元素 %d 出堆后\n", val);
|
||||||
PrintUtil.printHeap(heap);
|
PrintUtil.printHeap(heap);
|
||||||
@ -44,11 +44,11 @@ public class heap {
|
|||||||
System.out.format("\n堆顶元素为 %d\n", peek);
|
System.out.format("\n堆顶元素为 %d\n", peek);
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
testPoll(maxHeap);
|
testPop(maxHeap);
|
||||||
|
|
||||||
/* 获取堆大小 */
|
/* 获取堆大小 */
|
||||||
int size = maxHeap.size();
|
int size = maxHeap.size();
|
||||||
|
@ -87,7 +87,7 @@ class MaxHeap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 元素出堆 */
|
/* 元素出堆 */
|
||||||
public int poll() {
|
public int pop() {
|
||||||
// 判空处理
|
// 判空处理
|
||||||
if (isEmpty())
|
if (isEmpty())
|
||||||
throw new EmptyStackException();
|
throw new EmptyStackException();
|
||||||
@ -129,18 +129,6 @@ class MaxHeap {
|
|||||||
|
|
||||||
|
|
||||||
public class my_heap {
|
public class my_heap {
|
||||||
public static void testPush(MaxHeap maxHeap, int val) {
|
|
||||||
maxHeap.push(val); // 元素入堆
|
|
||||||
System.out.format("\n添加元素 %d 后\n", val);
|
|
||||||
maxHeap.print();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void testPoll(MaxHeap maxHeap) {
|
|
||||||
int val = maxHeap.poll(); // 堆顶元素出堆
|
|
||||||
System.out.format("\n出堆元素为 %d\n", val);
|
|
||||||
maxHeap.print();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
/* 初始化大顶堆 */
|
/* 初始化大顶堆 */
|
||||||
MaxHeap maxHeap = new MaxHeap(Arrays.asList(9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2));
|
MaxHeap maxHeap = new MaxHeap(Arrays.asList(9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2));
|
||||||
@ -158,7 +146,7 @@ public class my_heap {
|
|||||||
maxHeap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
peek = maxHeap.poll();
|
peek = maxHeap.pop();
|
||||||
System.out.format("\n堆顶元素 %d 出堆后\n", peek);
|
System.out.format("\n堆顶元素 %d 出堆后\n", peek);
|
||||||
maxHeap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ class MaxHeap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 元素出堆 */
|
/* 元素出堆 */
|
||||||
poll() {
|
pop() {
|
||||||
// 判空处理
|
// 判空处理
|
||||||
if (this.isEmpty()) throw new Error("堆为空");
|
if (this.isEmpty()) throw new Error("堆为空");
|
||||||
// 交换根结点与最右叶结点(即交换首元素与尾元素)
|
// 交换根结点与最右叶结点(即交换首元素与尾元素)
|
||||||
@ -119,18 +119,6 @@ class MaxHeap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function testPush(maxHeap, val) {
|
|
||||||
maxHeap.push(val); // 元素入堆
|
|
||||||
console.log(`\n添加元素 ${val} 后`);
|
|
||||||
maxHeap.print();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testPoll(maxHeap) {
|
|
||||||
let val = maxHeap.poll(); // 堆顶元素出堆
|
|
||||||
console.log(`\n出堆元素为 ${val}`);
|
|
||||||
maxHeap.print();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Driver Code */
|
/* Driver Code */
|
||||||
/* 初始化大顶堆 */
|
/* 初始化大顶堆 */
|
||||||
const maxHeap = new MaxHeap([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]);
|
const maxHeap = new MaxHeap([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]);
|
||||||
@ -148,7 +136,7 @@ console.log(`\n元素 ${val} 入堆后`);
|
|||||||
maxHeap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
peek = maxHeap.poll();
|
peek = maxHeap.pop();
|
||||||
console.log(`\n堆顶元素 ${peek} 出堆后`);
|
console.log(`\n堆顶元素 ${peek} 出堆后`);
|
||||||
maxHeap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ class MaxHeap:
|
|||||||
# 循环向上堆化
|
# 循环向上堆化
|
||||||
i = p
|
i = p
|
||||||
|
|
||||||
def poll(self) -> int:
|
def pop(self) -> int:
|
||||||
""" 元素出堆 """
|
""" 元素出堆 """
|
||||||
# 判空处理
|
# 判空处理
|
||||||
assert not self.is_empty()
|
assert not self.is_empty()
|
||||||
@ -102,18 +102,6 @@ class MaxHeap:
|
|||||||
print_heap(self.max_heap)
|
print_heap(self.max_heap)
|
||||||
|
|
||||||
|
|
||||||
def test_push(max_heap: MaxHeap, val: int):
|
|
||||||
max_heap.push(val) # 元素入堆
|
|
||||||
print(f"\n添加元素 {val} 后\n")
|
|
||||||
max_heap.print()
|
|
||||||
|
|
||||||
|
|
||||||
def test_poll(max_heap: MaxHeap):
|
|
||||||
val = max_heap.poll() # 堆顶元素出堆
|
|
||||||
print(f"\n出堆元素为 {val}\n")
|
|
||||||
max_heap.print()
|
|
||||||
|
|
||||||
|
|
||||||
""" Driver Code """
|
""" Driver Code """
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# 初始化大顶堆
|
# 初始化大顶堆
|
||||||
@ -132,7 +120,7 @@ if __name__ == "__main__":
|
|||||||
max_heap.print()
|
max_heap.print()
|
||||||
|
|
||||||
# 堆顶元素出堆
|
# 堆顶元素出堆
|
||||||
peek = max_heap.poll()
|
peek = max_heap.pop()
|
||||||
print(f"\n堆顶元素 {peek} 出堆后")
|
print(f"\n堆顶元素 {peek} 出堆后")
|
||||||
max_heap.print()
|
max_heap.print()
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ class MaxHeap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 元素出堆 */
|
/* 元素出堆 */
|
||||||
func poll() -> Int {
|
func pop() -> Int {
|
||||||
// 判空处理
|
// 判空处理
|
||||||
if isEmpty() {
|
if isEmpty() {
|
||||||
fatalError("堆为空")
|
fatalError("堆为空")
|
||||||
@ -148,7 +148,7 @@ enum MyHeap {
|
|||||||
maxHeap.print()
|
maxHeap.print()
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
peek = maxHeap.poll()
|
peek = maxHeap.pop()
|
||||||
print("\n堆顶元素 \(peek) 出堆后")
|
print("\n堆顶元素 \(peek) 出堆后")
|
||||||
maxHeap.print()
|
maxHeap.print()
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ class MaxHeap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 元素出堆 */
|
/* 元素出堆 */
|
||||||
public poll(): number {
|
public pop(): number {
|
||||||
// 判空处理
|
// 判空处理
|
||||||
if (this.isEmpty()) throw new RangeError('Heap is empty.');
|
if (this.isEmpty()) throw new RangeError('Heap is empty.');
|
||||||
// 交换根结点与最右叶结点(即交换首元素与尾元素)
|
// 交换根结点与最右叶结点(即交换首元素与尾元素)
|
||||||
@ -118,18 +118,6 @@ class MaxHeap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function testPush(maxHeap: MaxHeap, val: number): void {
|
|
||||||
maxHeap.push(val); // 元素入堆
|
|
||||||
console.log(`\n添加元素 ${val} 后`);
|
|
||||||
maxHeap.print();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testPoll(maxHeap: MaxHeap): void {
|
|
||||||
const val = maxHeap.poll(); // 堆顶元素出堆
|
|
||||||
console.log(`\n出堆元素为 ${val}`);
|
|
||||||
maxHeap.print();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Driver Code */
|
/* Driver Code */
|
||||||
/* 初始化大顶堆 */
|
/* 初始化大顶堆 */
|
||||||
const maxHeap = new MaxHeap([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]);
|
const maxHeap = new MaxHeap([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]);
|
||||||
@ -147,7 +135,7 @@ console.log(`\n元素 ${val} 入堆后`);
|
|||||||
maxHeap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
peek = maxHeap.poll();
|
peek = maxHeap.pop();
|
||||||
console.log(`\n堆顶元素 ${peek} 出堆后`);
|
console.log(`\n堆顶元素 ${peek} 出堆后`);
|
||||||
maxHeap.print();
|
maxHeap.print();
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ pub fn MaxHeap(comptime T: type) type {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 元素出堆
|
// 元素出堆
|
||||||
pub fn poll(self: *Self) !T {
|
pub fn pop(self: *Self) !T {
|
||||||
// 判断处理
|
// 判断处理
|
||||||
if (self.isEmpty()) unreachable;
|
if (self.isEmpty()) unreachable;
|
||||||
// 交换根结点与最右叶结点(即交换首元素与尾元素)
|
// 交换根结点与最右叶结点(即交换首元素与尾元素)
|
||||||
@ -171,7 +171,7 @@ pub fn main() !void {
|
|||||||
try maxHeap.print(mem_allocator);
|
try maxHeap.print(mem_allocator);
|
||||||
|
|
||||||
// 堆顶元素出堆
|
// 堆顶元素出堆
|
||||||
peek = try maxHeap.poll();
|
peek = try maxHeap.pop();
|
||||||
std.debug.print("\n堆顶元素 {} 出堆后\n", .{peek});
|
std.debug.print("\n堆顶元素 {} 出堆后\n", .{peek});
|
||||||
try maxHeap.print(mem_allocator);
|
try maxHeap.print(mem_allocator);
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
@ -19,14 +19,14 @@
|
|||||||
|
|
||||||
而恰好,**堆的定义与优先队列的操作逻辑完全吻合**,大顶堆就是一个元素从大到小出队的优先队列。从使用角度看,我们可以将「优先队列」和「堆」理解为等价的数据结构。因此,本文与代码对两者不做特别区分,统一使用「堆」来命名。
|
而恰好,**堆的定义与优先队列的操作逻辑完全吻合**,大顶堆就是一个元素从大到小出队的优先队列。从使用角度看,我们可以将「优先队列」和「堆」理解为等价的数据结构。因此,本文与代码对两者不做特别区分,统一使用「堆」来命名。
|
||||||
|
|
||||||
堆的常用操作见下表(方法命名以 Java 为例)。
|
堆的常用操作见下表,方法名需根据编程语言确定。
|
||||||
|
|
||||||
<div class="center-table" markdown>
|
<div class="center-table" markdown>
|
||||||
|
|
||||||
| 方法 | 描述 | 时间复杂度 |
|
| 方法名 | 描述 | 时间复杂度 |
|
||||||
| --------- | -------------------------------------------- | ----------- |
|
| --------- | ------------------------------------------ | ----------- |
|
||||||
| add() | 元素入堆 | $O(\log n)$ |
|
| push() | 元素入堆 | $O(\log n)$ |
|
||||||
| poll() | 堆顶元素出堆 | $O(\log n)$ |
|
| pop() | 堆顶元素出堆 | $O(\log n)$ |
|
||||||
| peek() | 访问堆顶元素(大 / 小顶堆分别为最大 / 小值) | $O(1)$ |
|
| peek() | 访问堆顶元素(大 / 小顶堆分别为最大 / 小值) | $O(1)$ |
|
||||||
| size() | 获取堆的元素数量 | $O(1)$ |
|
| size() | 获取堆的元素数量 | $O(1)$ |
|
||||||
| isEmpty() | 判断堆是否为空 | $O(1)$ |
|
| isEmpty() | 判断堆是否为空 | $O(1)$ |
|
||||||
@ -49,11 +49,11 @@
|
|||||||
Queue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
|
Queue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
|
||||||
|
|
||||||
/* 元素入堆 */
|
/* 元素入堆 */
|
||||||
maxHeap.add(1);
|
maxHeap.offer(1);
|
||||||
maxHeap.add(3);
|
maxHeap.offer(3);
|
||||||
maxHeap.add(2);
|
maxHeap.offer(2);
|
||||||
maxHeap.add(5);
|
maxHeap.offer(5);
|
||||||
maxHeap.add(4);
|
maxHeap.offer(4);
|
||||||
|
|
||||||
/* 获取堆顶元素 */
|
/* 获取堆顶元素 */
|
||||||
int peek = maxHeap.peek(); // 5
|
int peek = maxHeap.peek(); // 5
|
||||||
@ -217,11 +217,11 @@
|
|||||||
|
|
||||||
/* 堆顶元素出堆 */
|
/* 堆顶元素出堆 */
|
||||||
// 调用 heap.Interface 的方法,来移除元素
|
// 调用 heap.Interface 的方法,来移除元素
|
||||||
heap.Pop(maxHeap)
|
heap.Pop(maxHeap) // 5
|
||||||
heap.Pop(maxHeap)
|
heap.Pop(maxHeap) // 4
|
||||||
heap.Pop(maxHeap)
|
heap.Pop(maxHeap) // 3
|
||||||
heap.Pop(maxHeap)
|
heap.Pop(maxHeap) // 2
|
||||||
heap.Pop(maxHeap)
|
heap.Pop(maxHeap) // 1
|
||||||
|
|
||||||
/* 获取堆大小 */
|
/* 获取堆大小 */
|
||||||
size := len(*maxHeap)
|
size := len(*maxHeap)
|
||||||
@ -236,13 +236,13 @@
|
|||||||
=== "JavaScript"
|
=== "JavaScript"
|
||||||
|
|
||||||
```javascript title="heap.js"
|
```javascript title="heap.js"
|
||||||
// JavaScript 未提供内置 heap 类
|
// JavaScript 未提供内置 Heap 类
|
||||||
```
|
```
|
||||||
|
|
||||||
=== "TypeScript"
|
=== "TypeScript"
|
||||||
|
|
||||||
```typescript title="heap.ts"
|
```typescript title="heap.ts"
|
||||||
// TypeScript 未提供内置堆 Heap 类
|
// TypeScript 未提供内置 Heap 类
|
||||||
```
|
```
|
||||||
|
|
||||||
=== "C"
|
=== "C"
|
||||||
@ -291,7 +291,7 @@
|
|||||||
=== "Swift"
|
=== "Swift"
|
||||||
|
|
||||||
```swift title="heap.swift"
|
```swift title="heap.swift"
|
||||||
// Swift 未提供内置 heap 类
|
// Swift 未提供内置 Heap 类
|
||||||
```
|
```
|
||||||
|
|
||||||
=== "Zig"
|
=== "Zig"
|
||||||
@ -597,41 +597,41 @@
|
|||||||
顾名思义,**从顶至底堆化的操作方向与从底至顶堆化相反**,我们比较根结点的值与其两个子结点的值,将最大的子结点与根结点执行交换,并循环以上操作,直到越过叶结点时结束,或当遇到无需交换的结点时提前结束。
|
顾名思义,**从顶至底堆化的操作方向与从底至顶堆化相反**,我们比较根结点的值与其两个子结点的值,将最大的子结点与根结点执行交换,并循环以上操作,直到越过叶结点时结束,或当遇到无需交换的结点时提前结束。
|
||||||
|
|
||||||
=== "<1>"
|
=== "<1>"
|
||||||
![堆顶元素出堆步骤](heap.assets/heap_poll_step1.png)
|
![堆顶元素出堆步骤](heap.assets/heap_pop_step1.png)
|
||||||
|
|
||||||
=== "<2>"
|
=== "<2>"
|
||||||
![heap_poll_step2](heap.assets/heap_poll_step2.png)
|
![heap_pop_step2](heap.assets/heap_pop_step2.png)
|
||||||
|
|
||||||
=== "<3>"
|
=== "<3>"
|
||||||
![heap_poll_step3](heap.assets/heap_poll_step3.png)
|
![heap_pop_step3](heap.assets/heap_pop_step3.png)
|
||||||
|
|
||||||
=== "<4>"
|
=== "<4>"
|
||||||
![heap_poll_step4](heap.assets/heap_poll_step4.png)
|
![heap_pop_step4](heap.assets/heap_pop_step4.png)
|
||||||
|
|
||||||
=== "<5>"
|
=== "<5>"
|
||||||
![heap_poll_step5](heap.assets/heap_poll_step5.png)
|
![heap_pop_step5](heap.assets/heap_pop_step5.png)
|
||||||
|
|
||||||
=== "<6>"
|
=== "<6>"
|
||||||
![heap_poll_step6](heap.assets/heap_poll_step6.png)
|
![heap_pop_step6](heap.assets/heap_pop_step6.png)
|
||||||
|
|
||||||
=== "<7>"
|
=== "<7>"
|
||||||
![heap_poll_step7](heap.assets/heap_poll_step7.png)
|
![heap_pop_step7](heap.assets/heap_pop_step7.png)
|
||||||
|
|
||||||
=== "<8>"
|
=== "<8>"
|
||||||
![heap_poll_step8](heap.assets/heap_poll_step8.png)
|
![heap_pop_step8](heap.assets/heap_pop_step8.png)
|
||||||
|
|
||||||
=== "<9>"
|
=== "<9>"
|
||||||
![heap_poll_step9](heap.assets/heap_poll_step9.png)
|
![heap_pop_step9](heap.assets/heap_pop_step9.png)
|
||||||
|
|
||||||
=== "<10>"
|
=== "<10>"
|
||||||
![heap_poll_step10](heap.assets/heap_poll_step10.png)
|
![heap_pop_step10](heap.assets/heap_pop_step10.png)
|
||||||
|
|
||||||
与元素入堆操作类似,**堆顶元素出堆操作的时间复杂度为 $O(\log n)$** 。
|
与元素入堆操作类似,**堆顶元素出堆操作的时间复杂度为 $O(\log n)$** 。
|
||||||
|
|
||||||
=== "Java"
|
=== "Java"
|
||||||
|
|
||||||
```java title="my_heap.java"
|
```java title="my_heap.java"
|
||||||
[class]{MaxHeap}-[func]{poll}
|
[class]{MaxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{MaxHeap}-[func]{siftDown}
|
[class]{MaxHeap}-[func]{siftDown}
|
||||||
```
|
```
|
||||||
@ -639,7 +639,7 @@
|
|||||||
=== "C++"
|
=== "C++"
|
||||||
|
|
||||||
```cpp title="my_heap.cpp"
|
```cpp title="my_heap.cpp"
|
||||||
[class]{MaxHeap}-[func]{poll}
|
[class]{MaxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{MaxHeap}-[func]{siftDown}
|
[class]{MaxHeap}-[func]{siftDown}
|
||||||
```
|
```
|
||||||
@ -647,7 +647,7 @@
|
|||||||
=== "Python"
|
=== "Python"
|
||||||
|
|
||||||
```python title="my_heap.py"
|
```python title="my_heap.py"
|
||||||
[class]{MaxHeap}-[func]{poll}
|
[class]{MaxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{MaxHeap}-[func]{sift_down}
|
[class]{MaxHeap}-[func]{sift_down}
|
||||||
```
|
```
|
||||||
@ -655,7 +655,7 @@
|
|||||||
=== "Go"
|
=== "Go"
|
||||||
|
|
||||||
```go title="my_heap.go"
|
```go title="my_heap.go"
|
||||||
[class]{maxHeap}-[func]{poll}
|
[class]{maxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{maxHeap}-[func]{siftDown}
|
[class]{maxHeap}-[func]{siftDown}
|
||||||
```
|
```
|
||||||
@ -663,7 +663,7 @@
|
|||||||
=== "JavaScript"
|
=== "JavaScript"
|
||||||
|
|
||||||
```javascript title="my_heap.js"
|
```javascript title="my_heap.js"
|
||||||
[class]{MaxHeap}-[func]{poll}
|
[class]{MaxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{MaxHeap}-[func]{#siftDown}
|
[class]{MaxHeap}-[func]{#siftDown}
|
||||||
```
|
```
|
||||||
@ -671,7 +671,7 @@
|
|||||||
=== "TypeScript"
|
=== "TypeScript"
|
||||||
|
|
||||||
```typescript title="my_heap.ts"
|
```typescript title="my_heap.ts"
|
||||||
[class]{MaxHeap}-[func]{poll}
|
[class]{MaxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{MaxHeap}-[func]{siftDown}
|
[class]{MaxHeap}-[func]{siftDown}
|
||||||
```
|
```
|
||||||
@ -679,7 +679,7 @@
|
|||||||
=== "C"
|
=== "C"
|
||||||
|
|
||||||
```c title="my_heap.c"
|
```c title="my_heap.c"
|
||||||
[class]{maxHeap}-[func]{poll}
|
[class]{maxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{maxHeap}-[func]{siftDown}
|
[class]{maxHeap}-[func]{siftDown}
|
||||||
```
|
```
|
||||||
@ -687,7 +687,7 @@
|
|||||||
=== "C#"
|
=== "C#"
|
||||||
|
|
||||||
```csharp title="my_heap.cs"
|
```csharp title="my_heap.cs"
|
||||||
[class]{MaxHeap}-[func]{poll}
|
[class]{MaxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{MaxHeap}-[func]{siftDown}
|
[class]{MaxHeap}-[func]{siftDown}
|
||||||
```
|
```
|
||||||
@ -695,7 +695,7 @@
|
|||||||
=== "Swift"
|
=== "Swift"
|
||||||
|
|
||||||
```swift title="my_heap.swift"
|
```swift title="my_heap.swift"
|
||||||
[class]{MaxHeap}-[func]{poll}
|
[class]{MaxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{MaxHeap}-[func]{siftDown}
|
[class]{MaxHeap}-[func]{siftDown}
|
||||||
```
|
```
|
||||||
@ -703,7 +703,7 @@
|
|||||||
=== "Zig"
|
=== "Zig"
|
||||||
|
|
||||||
```zig title="my_heap.zig"
|
```zig title="my_heap.zig"
|
||||||
[class]{MaxHeap}-[func]{poll}
|
[class]{MaxHeap}-[func]{pop}
|
||||||
|
|
||||||
[class]{MaxHeap}-[func]{siftDown}
|
[class]{MaxHeap}-[func]{siftDown}
|
||||||
```
|
```
|
||||||
|