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
using
2
using
4int
using
6
using
7using
8
namespace
0
using
7namespace
2int
namespace
4
namespace
6
namespace
7
namespace
8 namespace
9int
std;
1int
std;
3
namespace
0
int
std;
7
std;
9
struct
1
namespace
6
struct
3 int
struct
5int
struct
7
namespace
0
Heap {
0 Heap {
1
namespace
6
struct
3 int
Heap {
5int
struct
7
namespace
0
Heap {
0
1
namespace
6
struct
3 int
5int
struct
7
namespace
0
Heap {
0 vector v;
3
using
7> v;
5
using
7> v;
7
namespace
6
namespace
6
int
using
02
namespace
0
int
2 using
06
using
7Heap {
0 using
09
int
using
12
using
14
using
16
Heap {
0 using
19
namespace
6
int
using
222 using
24
namespace
0
using
27 using
28int
using
30
using
7using
32
Heap {
0 using
32
namespace
6
int
using
38
namespace
0
using
41
using
43int
using
45
int
using
48
using
50
Heap {
0 using
53
namespace
6
Độ 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
using
2
using
4int
using
6
using
7using
8
namespace
0
using
7namespace
2int
namespace
4
namespace
6
namespace
7
namespace
8 namespace
9int
std;
1int
std;
3
namespace
0
int
std;
7
std;
9
struct
1
namespace
6
struct
3 int
struct
5int
struct
7
namespace
0
Heap {
0 Heap {
1
namespace
6
struct
3 int
Heap {
5int
struct
7
namespace
0
Heap {
0
1
namespace
6
struct
3 int
5int
struct
7
namespace
0
Heap {
0 vector v;
3
using
7> v;
5
using
7> v;
7
namespace
6
namespace
6
int
using
02
int
2 using
06
int
2 using
06
using
7Heap {
0 using
09
int
using
12
using
14
using
16
Heap {
0 using
19
namespace
6
int
using
222 using
24
namespace
0
namespace
82int
using
28namespace
85namespace
86
using
27 using
28int
using
30
using
7using
32
Heap {
0 using
32
namespace
6
int
using
38
namespace
0
using
41
int
using
48
int
using
48
using
50
Heap {
0 using
53
namespace
6
Độ 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:
- 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.
- Lặp lại các bước này K - 1 lần:
- Pop phần yếu tố ít nhất từ P.
- 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].
- 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
using
2
using
4int
using
6
using
7using
8
namespace
0
using
7namespace
222
namespace
6
namespace
7
struct
3 int
Heap {
5int
struct
7
namespace
0
Heap {
0
1
namespace
6
struct
3 int
5int
struct
7
namespace
0
Heap {
0 vector