Tạo cây nhị phân tự đặt hàng


20

Tôi có một nhiệm vụ mà tôi cần sử dụng cây tìm kiếm nhị phân và thay đổi nó để tự đặt hàng sao cho các mục được truy cập nhiều nhất (có mức độ ưu tiên cao hơn) nằm ở đầu cây, gốc là nút được truy cập nhiều nhất .

Giáo sư đã cho tôi BST và cấu trúc nút để làm việc, nhưng cố gắng tìm hiểu về thuật toán để cập nhật cây vì mọi thứ đang được chèn vào làm tôi bối rối.

Tôi biết rằng khi quá trình chèn đang diễn ra, nó sẽ kiểm tra xem dữ liệu của nút hiện tại nhỏ hơn hoặc lớn hơn nút hiện tại, sau đó đi theo hướng chính xác cho đến khi tìm thấy một con trỏ null và tự chèn vào đó. và sau khi được chèn, nó tăng mức ưu tiên lên 1.

template <class Type>
void BinarySearchTree<Type> ::  insert( const Type & x, BinaryNode<Type> * & t )
{
    if( t == NULL )
        t = new BinaryNode<Type>( x, NULL, NULL );
    else if( x < t->element )
        insert( x, t->left );
    else if( t->element < x )
        insert( x, t->right );
    else
        t->priority++;  // Duplicate; do nothing for right now
}

Bây giờ tôi cần tìm ra khi nào nút bằng nhau, làm thế nào để sắp xếp lại cây sao cho nút hiện tại (bằng với nút đã có) tìm thấy nút hiện có, tăng mức độ ưu tiên của nút đó, sau đó chuyển nó lên nếu root là một ưu tiên thấp hơn.

Tôi nghĩ rằng tôi có ý tưởng rằng logic AVL sẽ hoạt động và khi một sự thay đổi diễn ra, nó sẽ là một vòng quay phải hoặc một vòng quay trái.

Đây là nơi tôi bối rối, không thực sự biết bắt đầu từ đâu với việc tạo ra một thuật toán để giải quyết vấn đề. Do thuật toán AVL hoạt động với việc theo dõi sự cân bằng của cây, sau đó xoay các nút sang trái hoặc phải, nên cây này không cần phải lo lắng về việc cân bằng, chỉ là các nút có mức độ ưu tiên cao nhất không có con có mức độ ưu tiên cao hơn .

Câu trả lời:


12

Chỉ cần hai con trỏ:

  1. Nếu bạn muốn thực sự kết hợp các ý tưởng của hàng đợi ưu tiên và cây tìm kiếm nhị phân, hãy nghĩ đến việc kết hợp heap và BST trong một cấu trúc.
  2. Có khái niệm về danh sách tự tổ chức . Ý tưởng là chuyển phần tử được truy cập gần đây sang (hoặc hướng về phía trước) để tăng tốc truy cập trong tương lai cho phần tử tương tự, do đó "học" phân phối phần tử theo thời gian (với chất lượng tùy thuộc vào việc triển khai cụ thể). Có lẽ bạn có thể thích nghi với cây này?

Spoiler: Chỉ theo các liên kết dưới đây nếu bạn không thể tự mình nghĩ ra thứ gì đó.

1. Đây được gọi là một treap .
2. Splay cây thực hiện ý tưởng này.


2

Hãy nhìn vào cây splay, chúng thực sự là những gì bạn cần. Bạn sẽ phải sửa đổi chức năng splay, không được di chuyển từng nút truy cập đến cây, mà từ từ lên trên


2
Tại sao anh ta phải thực hiện thay đổi này? Chiến lược là khả thi , và có những chiến lược khác. Bên cạnh đó, đây là / là một câu hỏi bài tập về nhà nên các gợi ý được ưu tiên cho các giải pháp (không bị thiếu). Cuối cùng, câu trả lời này là dư thừa; có lẽ bạn có thể thay đổi nó để dẫn dắt OP hướng tới giải pháp đề xuất của bạn?
Raphael

Chà, một vài gợi ý cho bạn sau đó: 1. Hãy xem chức năng splay và xem nó làm gì, đọc câu hỏi và tìm ra, dựa trên những gì nó nói, cho dù bạn có sửa đổi chức năng splay hay không. Và không, không phải tất cả các chiến lược đều khả thi vì anh ta có những yêu cầu nhất định phải đáp ứng dựa trên mức độ ưu tiên nên việc chuyển sang phía trước mọi lúc là không hợp lệ 2. Giải pháp không bị lỗi? Làm thế nào là câu trả lời của tôi và giải pháp chưa hoàn thành? 3. "Dự phòng như vậy" ... Tôi không thấy câu trả lời của bạn, ôi, xin lỗi - gợi ý là tối thượng và "giải pháp không bị lỗi" của tôi mang đến sự chú ý
Bober02
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.