Xem xét một đống nhị phân chứa n số (gốc lưu trữ số lớn nhất). Bạn được cung cấp số nguyên dương k < n và một số x. Bạn phải xác định liệu yếu tố lớn nhất thứ k của heap có lớn hơn x hay không. Thuật toán của bạn phải mất thời gian O (k). Bạn có thể sử dụng bộ nhớ bổ sung O (k)cách xác định xem phần tử lớn nhất thứ k của heap có lớn hơn x
Trả lời
Dfs đơn giản có thể làm điều đó, chúng tôi có bộ đếm được đặt bằng không. Bắt đầu từ gốc và trong mỗi lần lặp kiểm tra giá trị nút nếu lớn hơn x, sau đó tăng thuật toán truy cập và chạy cho các nút con. Khi bộ đếm lớn hơn hoặc bằng k thuật toán sẽ được hoàn thành, cũng nếu không có nút nào để kiểm tra, thuật toán sẽ trả về false. Mã đơn giản. Thời gian chạy là O (k) bởi vì nhiều nhất bạn sẽ kiểm tra nút k và mỗi lần lặp là O (1).
Mã giả trông giống như sau.
void CheckNode(Node node,int k, int x, ref int counter)
{
if (node.value > x)
{
counter++;
if (counter >= k)
return;
CheckNode(node.Left, k, x, ref counter);
CheckNode(node.Right,k, x, ref counter);
}
}
sử dụng nó:
counter = 0;
CheckNode(root,index,val,counter);
if (counter >= index)
return true;
return false;
nếu node.value < x sau đó tất cả trẻ em giá trị nhỏ hơn x và không có cần phải kiểm tra.
Như @Eric Mickelsen đã đề cập trong phần bình luận trường hợp xấu nhất thời gian chạy chính xác là 2k-1 (k> 0) như sau.
Số lượng nút được truy cập có giá trị lớn hơn x sẽ tối đa là k. Mỗi nút được truy cập có giá trị nhỏ hơn x phải là con của một nút được truy cập có giá trị lớn hơn x. Tuy nhiên, vì mọi nút được truy cập ngoại trừ gốc phải có cha hoặc mẹ có giá trị lớn hơn x, số lượng nút có giá trị nhỏ hơn x được truy cập phải tối đa là ((k-1) * 2) - (k-1)) = k-1, vì k-1 của (k-1) * 2 trẻ có giá trị lớn hơn x. Điều này có nghĩa là chúng tôi truy cập các nút k lớn hơn x và k-1 nhỏ hơn x, là 2k-1.
* "và chạy thuật toán cho các nút con" * Đây là vấn đề. Làm thế nào để bạn chọn, với đứa trẻ để bắt đầu? Lưu ý, nó không phải là một cây nhị phân được sắp xếp, nó chỉ là một đống. –
@Nikita Rybak, cả hai đứa trẻ. xem mã. –
@Saeed Không, từ đó bắt đầu. Trong mã của bạn, bạn chỉ cần duyệt qua đống theo thứ tự từ trái sang phải. Nhưng trẻ em không được sắp xếp! 'node.left' có thể nhỏ hơn và lớn hơn' node.right'. [Có một hình ảnh] (http://en.wikipedia.org/wiki/Binary_heap) của đống nhị phân. –
public class KSmallest2 {
private MinPQ<Integer> minHeap;
private int x;
private int k;
private int count = 0;
public KSmallest2(String filename, int x, int k) {
this.x = x;
this.k = k;
minHeap = new MinPQ<>();
try {
Scanner in = new Scanner(new File(filename));
while (in.hasNext()) {
minHeap.insert(in.nextInt());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public boolean check(int index) {
if (index > minHeap.size()) {
return false;
}
if (minHeap.getByIndex(index) < x) {
count++;
if (count >= k) {
return true;
}
return check(2 * index) ||
check(2 * index + 1);
}
return false;
}
public static void main(String[] args) {
KSmallest2 ks = new KSmallest2("src/main/resources/minheap.txt", 18, 5);
System.out.println(ks.minHeap);
System.out.println(ks.check(1));
}
}
- 1. Phần tử thứ K trong cây heap
- 2. In các phần tử K lớn nhất trong một đống nhất định trong O (K * log (K))?
- 3. chỉ số của k phần tử lớn nhất trong một mảng có chiều dài không phân loại
- 4. Cách tìm chỉ mục của n phần tử lớn nhất trong danh sách hoặc np.array, Python
- 5. Tính số nguyên nhỏ nhất với số bit k được đặt lớn hơn số nguyên khác x?
- 6. Số thứ hai lớn nhất
- 7. Phân mảnh Heap đối tượng lớn
- 8. Làm thế nào để tối đa khối tiếp giáp lớn nhất của bộ nhớ trong đối tượng lớn Heap
- 9. Xác định một cách xác định xem một số lớn là số nguyên tố hay composite?
- 10. tìm thư mục có kích thước lớn hơn x MB
- 11. Tìm lượng tử thứ k của tập hợp các phần tử n. (Từ cormen)
- 12. tìm công suất lớn nhất của hai số nhỏ hơn X?
- 13. Xóa phần tử khỏi phần giữa của tiêu chuẩn :: heap
- 14. Tìm dãy số có tổng lớn nhất của các phần tử trong một mảng
- 15. Đặt chiều cao của 3 phần tử, lấy giá trị lớn nhất, qua nhiều hàng
- 16. Cách tạo chế độ xem lớn hơn màn hình?
- 17. Tìm các chỉ số của các nguyên tố lớn hơn x
- 18. làm thế nào để có hiệu quả có được các yếu tố lớn hơn k của một danh sách trong python
- 19. Tác động của việc xác định cột VARCHAR2 có độ dài lớn hơn
- 20. Chỉ mục danh sách Python đầu tiên lớn hơn x?
- 21. ORA-01.438: giá trị lớn hơn độ chính xác nhất định cho phép cột này
- 22. Cách thiết lập kích thước heap JVM thực sự lớn?
- 23. Cách tốt nhất để tạo các phần tử DOM tĩnh lớn trong JavaScript là gì?
- 24. Phần tử nhỏ nhất thứ K trong ma trận được sắp xếp
- 25. Làm cách nào để tìm danh sách trong danh sách các danh sách có tổng số phần tử lớn nhất?
- 26. Java - Cách viết hình ảnh tif rất lớn (20.000x20.000 px hoặc lớn hơn)
- 27. C#: Cách thanh lịch nhất để kiểm tra nếu int x là phần tử của một tập hợp nhất định?
- 28. Xem và ViewModel quá lớn
- 29. Làm thế nào để có được chỉ số phần tử lớn nhất trong mảng matlab
- 30. Cách lấy số lớn nhất từ số lượng lớn các số?
-1: nó là một vấn đề thú vị nhưng đây là cách sai lầm khi gửi một câu hỏi. Vui lòng không sao chép nguyên văn chỉ định ở đây. –