การสร้างแผนภูมิต้นไม้สั่งซื้อด้วยตนเอง


20

ฉันมีการมอบหมายที่ฉันต้องใช้ต้นไม้ค้นหาแบบทวิภาคและปรับเปลี่ยนเพื่อเรียงลำดับตัวเองเช่นรายการที่เข้าถึงได้มากที่สุด (มีลำดับความสำคัญสูงกว่า) อยู่ที่ด้านบนของต้นไม้รากเป็นโหนดที่เข้าถึงได้มากที่สุด .

ศาสตราจารย์ให้ BST และโหนดโครงสร้างเพื่อทำงานร่วมกับฉัน แต่การพยายามเอาสมองของฉันไปรอบ ๆ อัลกอริทึมเพื่ออัปเดตต้นไม้เมื่อสิ่งต่าง ๆ แทรกอยู่ทำให้ฉันสับสน

ฉันรู้ว่าเมื่อมีการแทรกเกิดขึ้นมันจะตรวจสอบว่าข้อมูลของโหนดปัจจุบันน้อยกว่าหรือมากกว่าโหนดปัจจุบันจากนั้นจะวนซ้ำในทิศทางที่ถูกต้องจนกว่าจะพบตัวชี้ null และแทรกตัวเองที่นั่น และหลังจากใส่แล้วจะเพิ่มระดับความสำคัญเป็น 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
}

ตอนนี้ฉันต้องคิดออกเมื่อโหนดเท่ากันวิธีการสั่งซื้อต้นไม้ใหม่เพื่อให้โหนดปัจจุบัน (ซึ่งเท่ากับโหนดที่มีอยู่แล้ว) ค้นหาโหนดที่มีอยู่เพิ่มลำดับความสำคัญของโหนดนั้นแล้วเลื่อนขึ้นถ้า รูทเป็นลำดับความสำคัญต่ำกว่า

ฉันคิดว่าฉันมีความคิดว่าตรรกะ AVL จะทำงานได้และเมื่อมีการเปลี่ยนแปลงเกิดขึ้นมันจะเป็นการหมุนครั้งเดียวหรือหมุนครั้งเดียว

ที่นี่ฉันสับสนไม่ทราบว่าจะเริ่มต้นด้วยการสร้างอัลกอริทึมในการแก้ปัญหาได้อย่างไร เนื่องจากอัลกอริทึม AVL ทำงานกับการติดตามความสมดุลของต้นไม้จากนั้นหมุนโหนดไปทางซ้ายหรือขวาตามลำดับต้นไม้นี้ไม่จำเป็นต้องกังวลเกี่ยวกับความสมดุลเพียงแค่ว่าโหนดที่มีลำดับความสำคัญสูงสุดไม่มีลูกที่มีลำดับความสำคัญสูงกว่า .

คำตอบ:


12

แค่สองพอยน์เตอร์:

  1. หากคุณต้องการรวมแนวคิดของคิวลำดับความสำคัญและแผนผังการค้นหาแบบไบนารีให้คิดถึงการรวมฮีปและ BST ไว้ในโครงสร้างเดียว
  2. มีแนวคิดของรายการจัดระเบียบตนเอง แนวคิดคือการย้ายองค์ประกอบที่เข้าถึงเมื่อเร็ว ๆ นี้ไปยัง (หรือไปข้างหน้า) เพื่อเร่งความเร็วการเข้าถึงองค์ประกอบเดียวกันในอนาคตดังนั้น "การเรียนรู้" การกระจายองค์ประกอบตลอดเวลา (มีคุณภาพขึ้นอยู่กับการใช้งานเฉพาะ) บางทีคุณสามารถปรับมันให้เข้ากับต้นไม้ได้?

ผู้สปอยเลอร์:ตามลิงค์ด้านล่างเฉพาะในกรณีที่คุณไม่สามารถหาอะไรมาเองได้

1. นี้เรียกว่าทรีพ
2. Splay treesใช้ความคิดนี้


2

ลองดูต้นไม้ที่มีประโยชน์จริงๆ คุณจะต้องแก้ไขฟังก์ชั่น splay ไม่ใช่เพื่อย้ายแต่ละโหนดที่เข้าถึงได้ตลอดทางจนถึงต้นไม้ แต่ค่อยๆสูงขึ้น


2
ทำไมเขาต้องทำการเปลี่ยนแปลงนี้? กลยุทธ์อย่างใดอย่างหนึ่งอาจเป็นไปได้และมีคนอื่น นอกจากนี้นี่คือ / เป็นคำถามทำการบ้านดังนั้นคำแนะนำเป็นที่ต้องการโซลูชั่น (uncommented) สุดท้ายคำตอบนี้ซ้ำซ้อนเหมือนเดิม บางทีคุณสามารถเปลี่ยนมันเพื่อนำ OP ไปสู่โซลูชันที่คุณเสนอ?
กราฟิลส์

ทีนี้คำใบ้สองสามข้อสำหรับคุณ: 1. ลองฟังก์ชั่น splay และดูว่ามันทำอะไรได้อย่างไรอ่านคำถามและหาตามสิ่งที่พูดไม่ว่าคุณจะดัดแปลงฟังก์ชั่น splay หรือไม่ และไม่ไม่ใช่กลยุทธ์ทั้งหมดที่สามารถใช้งานได้เนื่องจากเขามีข้อกำหนดบางประการที่จะต้องพบเจอตามลำดับความสำคัญดังนั้นการขยับไปข้างหน้าตลอดเวลานั้นไม่ถูกต้อง คำตอบและวิธีแก้ปัญหาของฉันคืออะไร? 3. "ซ้ำซ้อนเหมือนเดิม" ... ฉันไม่เห็นว่าคำตอบของคุณอุ๊ปส์ขอโทษ - คำแนะนำนั้นดีที่สุดและ "คำพูดที่ไม่ได้รับการแก้ไข" ของฉันนำมาซึ่งการสังเกตตาราง
Bober02
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.