Hướng dẫn how do i get the kth smallest element in heap python? - làm cách nào để lấy phần tử nhỏ nhất thứ k trong heap python?

Cho một min-heap có kích thước n, tìm phần tử ít nhất trong min-heap. & Nbsp;

Examples:

Đầu vào: {10, 50, 40, 75, 60, 65, 45} k = 4 & nbsp; đầu ra: 50 & nbsp; : {10, 50, 40, 75, 60, 65, 45} k = 4 
Output : 50 

Đầu vào: {10, 50, 40, 75, 60, 65, 45} k = 2 & nbsp; đầu ra: 40 : {10, 50, 40, 75, 60, 65, 45} k = 2 
Output : 40

Được đề xuất: Vui lòng thử cách tiếp cận của bạn trên {IDE} trước, trước khi chuyển sang giải pháp.{IDE} first, before moving on to the solution.

Cách tiếp cận ngây thơ: Chúng ta có thể trích xuất phần tử tối thiểu từ min-heap k lần và phần tử cuối cùng được trích xuất sẽ là phần tử tối thiểu thứ k. Mỗi thao tác xóa mất thời gian o [log n], do đó tổng độ phức tạp thời gian của phương pháp này xuất hiện là o [k * log n]. & Nbsp;: We can extract the minimum element from the min-heap k times and the last element extracted will be the kth least element. Each deletion operation takes O[log n] time, so the total time complexity of this approach comes out to be O[k * log n]. 

Implementation:

C++

#include

using namespace std;

struct Heap {

    vector v;

    int using2

    using4int using6

using7using8

    namespace0

using7namespace2intnamespace4

    namespace6

namespace7

namespace8 namespace9intstd;1intstd;3

namespace0

    int std;7

    std;9

    struct1

namespace6

struct3 int struct5int struct7

namespace0

    Heap {0 Heap {1

namespace6

struct3 int Heap {5int struct7

namespace0

    Heap {0     1

namespace6

struct3 int     5int struct7

namespace0

    Heap {0 vector v;3

using7> v;5

using7> v;7

    namespace6

namespace6

int using02

namespace0

    int2 using06

using7Heap {0 using09

    int using12

    using14

    using16

    Heap {0 using19

namespace6

int using222 using24

namespace0

    using27 using28int using30

using7using32

    Heap {0 using32

namespace6

int using38

namespace0

    using41

    using43intusing45

    int using48

    using50

    Heap {0 using53

namespace6

Độ phức tạp về thời gian: o [k * log n] & nbsp; 

Cách tiếp cận hiệu quả: & NBSP;

Chúng tôi có thể lưu ý một quan sát thú vị về Min-heap. Một yếu tố X ở cấp độ ith có i - 1 tổ tiên. Theo tài sản của min-heaps, những tổ tiên I-1 này được đảm bảo là nhỏ hơn x. Điều này ngụ ý rằng X không thể nằm trong số các yếu tố I - 1 ít nhất của đống. Sử dụng thuộc tính này, chúng ta có thể kết luận rằng phần tử tối thiểu thứ k có thể có mức tối đa k. Chúng ta có thể giảm kích thước của min-heap sao cho nó chỉ có mức K. Sau đó, chúng ta có thể có được phần tử ít nhất k bằng chiến lược trước đây về trích xuất phần tử tối thiểu k lần. & Nbsp;

Lưu ý rằng kích thước của đống được giảm xuống mức tối đa là 2k - 1, do đó, mỗi hoạt động của Heapify sẽ mất thời gian O [log 2K] = O [k]. Tổng độ phức tạp thời gian sẽ là O [K2]. Nếu n >> k, thì phương pháp này thực hiện tốt hơn so với phương pháp trước. & Nbsp;

Implementation:

C++

#include

using namespace std;

struct Heap {

    vector v;

    int using2

    using4int using6

using7using8

    namespace0

using7namespace2intnamespace4

    namespace6

namespace7

namespace8 namespace9intstd;1intstd;3

namespace0

    int std;7

    std;9

    struct1

namespace6

struct3 int struct5int struct7

namespace0

    Heap {0 Heap {1

namespace6

struct3 int Heap {5int struct7

namespace0

    Heap {0     1

namespace6

struct3 int     5int struct7

namespace0

    Heap {0 vector v;3

using7> v;5

using7> v;7

    namespace6

namespace6

int using02

    int2 using06

    int2 using06

using7Heap {0 using09

    int using12

    using14

    using16

    Heap {0 using19

namespace6

int using222 using24

namespace0

    namespace82intusing28namespace85namespace86

    using27 using28int using30

using7using32

    Heap {0 using32

namespace6

int using38

namespace0

    using41

    int using48

    int using48

    using50

    Heap {0 using53

namespace6

Độ phức tạp về thời gian: O [K2] Cách tiếp cận hiệu quả hơn: & nbsp; More efficient approach

Chúng ta có thể cải thiện hơn nữa độ phức tạp về thời gian của vấn đề này bằng thuật toán sau:

  1. Tạo một hàng đợi ưu tiên P [hoặc min heap] và chèn nút gốc của min-heap vào P. Chức năng so sánh của hàng đợi ưu tiên phải sao cho phần tử nhỏ nhất được bật ra.
  2. Lặp lại các bước này K - 1 lần:
    1. Pop phần yếu tố ít nhất từ ​​P.
    2. Chèn các phần tử con trái và phải của phần tử popped. [nếu chúng tồn tại].
  3. Yếu tố ít nhất trong p là yếu tố ít nhất của min-heap.

Kích thước ban đầu của hàng đợi ưu tiên là một, và nó tăng lên tối đa một ở mỗi bước K - 1. Do đó, có các yếu tố k tối đa trong hàng đợi ưu tiên và độ phức tạp về thời gian của các hoạt động POP và chèn là O [log k]. Do đó, tổng độ phức tạp thời gian là o [k * log k]. & Nbsp;

Implementation:

C++

#include

using namespace std;

struct Heap {

    vector v;

    int using2

    using4int using6

using7using8

    namespace0

using7namespace222

    namespace6

namespace7

struct3 int Heap {5int struct7

namespace0

    Heap {0     1

namespace6

struct3 int     5int struct7

namespace0

    Heap {0 vector

Bài Viết Liên Quan

Chủ Đề