国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Home Java javaTutorial Heap - Min e Max

Heap - Min e Max

Nov 03, 2024 pm 09:06 PM

Heap - Min e Max

Heap - Min Heap

Heap is a more efficient version of the priority list. Take into account the insertion and removal methods of the Priority Queue Sorted and Unsorted, in Unsorted insertion costs O(1), removing costs O(n), while Sorted insertion costs O(n) and removing O(1).

sorted unsorted
insert O(n) O(1)
remove O(1) O(n)

Heap is built by an Array, but its representation is a binary tree, the element with the most priority is at the top, the root. It is filled from top to bottom and right to left, with no children missing!

?

However, there is the possibility of building the data structure with the highest priority being defined by the highest key value. In this case we have the max heap, which we will see later.

Min_Heap

To be a valid Heap, all child elements must have lower or equal priority than their parents. Furthermore, it must be complete with no missing children, otherwise the array will have a blank space.

?

A more formal way of carrying out this definition is to say that a binary tree is complete if its levels 0, 1, 2, · · · h ? 1 have the maximum possible elements and the elements existing at level h are allocated as far left as possible.

As mentioned, heap is made up of an array (represented in green), but can be viewed as a tree structure, as shown in the image below.

There are two ways to assemble the Heap, with the first element in position 0, or without position 0, in this article we will see the difference between the two cases. The elements at the top always have their children, commonly known as elements at the bottom, to discover these children, in the case of index 0, you can get this information using these calculations:

rigthChild = LeftChild + 1
//para saber o elemento da esquerda do pai
leftChild = indexDoFilho * 2 +1
//para saber qual o pai do elemento
parent = (indexDoFilho -1)/2

If you use a version with 0 not filled in, just reduce the sum, that is, 1-1=0, in the parent case it is index / 2.

Insert

It is always added at the end, the only concern you should have is when checking whether the child element has a lower key than the parent, for this purpose bubbling up is performed, which is when the Keys of the inserted element are compared and the father, changing if necessary.

Speaking in more detail, place the element in the last empty space of the tree and, as you need to compare its key with that of the parent, we need to calculate the parent's index to access its key. To find out the father, use the calculation mentioned:

parent = (indexDoFilho -1)/2

And for this, the indexDoFilho is missing: to obtain this, we take a variable to be the current index, as we are in the insert which is an addition at the end, the current index is the last one, being:

currentIndex = size-1

Now having the current index, call Parent and find out who is the father of the element being inserted. We want the parent of this new element because, to organize the tree correctly, this element must be compared with its parent and, if its key is smaller, they must swap locations.

As long as the current index is greater than 0 (in order to avoid picking up an unavailable index) and the current index is smaller than the parent's index, if this condition is true, the element needs to be exchanged with the parent to guarantee ownership of the minimum heap and then the swap occurs and then the current index receives the parent's index, and then takes the parent's parent (KKKKK) for . Swap is a method that uses the structure of a normal exchange of values.

rigthChild = LeftChild + 1
//para saber o elemento da esquerda do pai
leftChild = indexDoFilho * 2 +1
//para saber qual o pai do elemento
parent = (indexDoFilho -1)/2

Being related:

parent = (indexDoFilho -1)/2

Swap being a normal method of exchanging values:

currentIndex = size-1

If the value of the current (child) element is less than the value of the parent, this indicates that the minimum heap property has been violated. In a minimal heap, the parent must always be less than or equal to the child. When this condition is not met, the child must swap places with the parent so that the smaller value continues to "climb" in the heap until it finds the correct position, where the property will be maintained.

Remove

Removes the index 0 element, but the tree is no longer complete! To solve this, pull the last element of the array to the beginning, that is, the last element that was added goes to the top of the tree. After that, check again, but now from top to bottom. In other words, now is the time to compare parents with their children! (sinkdown)
The sinkDown() method moves the element down (or “sinks”) in the heap, until it is in the correct position, where its value is less than or equal to that of its children (if it is in a position with children).
In sinkDown there is a variable to store the index of the element with the lowest key starting at the root and another for the current index. Then, a loop that will last until the index of the current element is equal to the index of the element with the lowest key. Inside the loop, get the children of the current one and see if the children are within the array range and if the child's index is less than the minimum index, it updates the minimum.

public void insert(K key, V value) { //o(log n)
    if (isFull()){
        throw new RuntimeException("full");
    }
    //adc a entry na ultima posi??o do vetor
    heap[size++]=new PriorityEntry(key, value);
    //guarda o index que esse novo elemento tá
    int currentIndex = size-1;
    //chama o método parent pra calcular quem é o pai do novo elemento
    int parent = parent(currentIndex);
    //percorre enquanto o index nao for o 0 e o index ser 
    while (currentIndex>0 && compare(currentIndex, parent)<0){
        swap(currentIndex, parent);
        currentIndex = parent;
        parent = parent(currentIndex);
    }
}

In this case:

protected int parent(int index){
        return (index-1)/2;
}

Summary:

Min Heap Properties:

  • Complete binary tree structure.
  • The parent node always has a value equal to or less than its child nodes.
  • Implemented via array, where the position of the children and parent is determined by formulas based on the index.

To calculate positions of children and parents:

  • Left: leftChild = index * 2 1
  • Right: rightChild = index * 2 2
  • Parent: parent = (index - 1) / 2

Version without index 0: Just subtract 1 from the calculations, resulting in:

  • leftChild = index * 2
  • rightChild = index * 2 1
  • parent = index / 2

Heap - Max Heap

The highest value is at the root, so the parent node has the same or greater value than its children

The formulas for calculating children and parents:

  • Left: leftChild = index * 2 1
  • Right: rightChild = index * 2 2
  • Parent: parent = (index - 1) / 2

Insert

Adds the element at the end and bubbling up, which would be comparing the element with its parent, changing location if necessary. O(log n).

rigthChild = LeftChild + 1
//para saber o elemento da esquerda do pai
leftChild = indexDoFilho * 2 +1
//para saber qual o pai do elemento
parent = (indexDoFilho -1)/2

Remove

Removes the heapMax[0] element, aka the root, and then takes the last element and moves it up to the root, calling sinkdown then pushing the new element from the root down until it finds its correct position.

sinkDown needs to ensure that the value in the parent node is greater than or equal to the values ??in the child nodes. Therefore, when sinking a node, it will be compared with the largest child.

In the Min Heap, sinkDown must ensure that the value in the parent node is less than or equal to the values ??of the children. In this case, the comparison is made with the smallest child.

parent = (indexDoFilho -1)/2
currentIndex = size-1

Differences

  • In Max Heap, sinkDown needs to ensure that the value in the parent node is greater than or equal to the values ??in the child nodes. Therefore, when sinking a node, it will be compared with the largest child.
  • In Max Heap, if the parent node is smaller than the largest of its children, then it must swap with the largest child to ensure that the largest value is as high as possible.
  • In the Min Heap, sinkDown must ensure that the value in the parent node is less than or equal to the values ??of the children. In this case, the comparison is made with the smallest child.
  • In the Min Heap, switching occurs if the parent node is greater than the smallest of the children, keeping the smallest value at the top

The above is the detailed content of Heap - Min e Max. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Difference between HashMap and Hashtable? Difference between HashMap and Hashtable? Jun 24, 2025 pm 09:41 PM

The difference between HashMap and Hashtable is mainly reflected in thread safety, null value support and performance. 1. In terms of thread safety, Hashtable is thread-safe, and its methods are mostly synchronous methods, while HashMap does not perform synchronization processing, which is not thread-safe; 2. In terms of null value support, HashMap allows one null key and multiple null values, while Hashtable does not allow null keys or values, otherwise a NullPointerException will be thrown; 3. In terms of performance, HashMap is more efficient because there is no synchronization mechanism, and Hashtable has a low locking performance for each operation. It is recommended to use ConcurrentHashMap instead.

Why do we need wrapper classes? Why do we need wrapper classes? Jun 28, 2025 am 01:01 AM

Java uses wrapper classes because basic data types cannot directly participate in object-oriented operations, and object forms are often required in actual needs; 1. Collection classes can only store objects, such as Lists use automatic boxing to store numerical values; 2. Generics do not support basic types, and packaging classes must be used as type parameters; 3. Packaging classes can represent null values ??to distinguish unset or missing data; 4. Packaging classes provide practical methods such as string conversion to facilitate data parsing and processing, so in scenarios where these characteristics are needed, packaging classes are indispensable.

How does JIT compiler optimize code? How does JIT compiler optimize code? Jun 24, 2025 pm 10:45 PM

The JIT compiler optimizes code through four methods: method inline, hot spot detection and compilation, type speculation and devirtualization, and redundant operation elimination. 1. Method inline reduces call overhead and inserts frequently called small methods directly into the call; 2. Hot spot detection and high-frequency code execution and centrally optimize it to save resources; 3. Type speculation collects runtime type information to achieve devirtualization calls, improving efficiency; 4. Redundant operations eliminate useless calculations and inspections based on operational data deletion, enhancing performance.

What are static methods in interfaces? What are static methods in interfaces? Jun 24, 2025 pm 10:57 PM

StaticmethodsininterfaceswereintroducedinJava8toallowutilityfunctionswithintheinterfaceitself.BeforeJava8,suchfunctionsrequiredseparatehelperclasses,leadingtodisorganizedcode.Now,staticmethodsprovidethreekeybenefits:1)theyenableutilitymethodsdirectly

What is an instance initializer block? What is an instance initializer block? Jun 25, 2025 pm 12:21 PM

Instance initialization blocks are used in Java to run initialization logic when creating objects, which are executed before the constructor. It is suitable for scenarios where multiple constructors share initialization code, complex field initialization, or anonymous class initialization scenarios. Unlike static initialization blocks, it is executed every time it is instantiated, while static initialization blocks only run once when the class is loaded.

What is the `final` keyword for variables? What is the `final` keyword for variables? Jun 24, 2025 pm 07:29 PM

InJava,thefinalkeywordpreventsavariable’svaluefrombeingchangedafterassignment,butitsbehaviordiffersforprimitivesandobjectreferences.Forprimitivevariables,finalmakesthevalueconstant,asinfinalintMAX_SPEED=100;wherereassignmentcausesanerror.Forobjectref

What is the Factory pattern? What is the Factory pattern? Jun 24, 2025 pm 11:29 PM

Factory mode is used to encapsulate object creation logic, making the code more flexible, easy to maintain, and loosely coupled. The core answer is: by centrally managing object creation logic, hiding implementation details, and supporting the creation of multiple related objects. The specific description is as follows: the factory mode handes object creation to a special factory class or method for processing, avoiding the use of newClass() directly; it is suitable for scenarios where multiple types of related objects are created, creation logic may change, and implementation details need to be hidden; for example, in the payment processor, Stripe, PayPal and other instances are created through factories; its implementation includes the object returned by the factory class based on input parameters, and all objects realize a common interface; common variants include simple factories, factory methods and abstract factories, which are suitable for different complexities.

What is type casting? What is type casting? Jun 24, 2025 pm 11:09 PM

There are two types of conversion: implicit and explicit. 1. Implicit conversion occurs automatically, such as converting int to double; 2. Explicit conversion requires manual operation, such as using (int)myDouble. A case where type conversion is required includes processing user input, mathematical operations, or passing different types of values ??between functions. Issues that need to be noted are: turning floating-point numbers into integers will truncate the fractional part, turning large types into small types may lead to data loss, and some languages ??do not allow direct conversion of specific types. A proper understanding of language conversion rules helps avoid errors.

See all articles