ต้นไม้ไบนารีมีจุดประสงค์เฉพาะในการจัดเก็บข้อมูลแบบลำดับชั้นหรือไม่? การใช้งานแบบบัญญัติของพวกเขาคืออะไร


12

ฉันเข้าใจโครงสร้างของต้นไม้ไบนารีและวิธีสำรวจมัน อย่างไรก็ตามฉันพยายามดิ้นรนเพื่อให้ตระหนักถึงการใช้งานจริงวัตถุประสงค์ในโปรแกรมและการเขียนโปรแกรม เมื่อฉันคิดถึงตัวอย่าง 'ข้อมูลจริง' ของลำดับชั้นพวกเขาเกือบจะมีลูกมากกว่า 2 คน ตัวอย่างเช่นในแผนภูมิต้นไม้แม่มักจะมีลูกมากกว่าสองคน

'ต้นไม้ไบนารี' จริงๆมีประโยชน์เฉพาะในการจัดเก็บข้อมูลที่เกี่ยวข้องเชิงเส้นเนื่องจากเวลาในการประมวลผลที่รวดเร็วกว่าอาร์เรย์และรายการ? หรือมิฉะนั้นพวกเขาจะให้บริการวัตถุประสงค์เฉพาะในการจัดเก็บข้อมูลลำดับชั้น? ถ้าเป็นเช่นนั้นมีตัวอย่างอะไรบ้างในการใช้งานของต้นไม้ไบนารี ข้อมูลอะไรเป็นเช่นนั้นโหนดมีที่มากที่สุดเด็ก 2 คน?


ฉันคิดว่าการใช้หลักของต้นไม้ไบนารีคือการสั่งซื้อข้อมูล https://en.wikipedia.org/wiki/Binary_search_tree
Mandrill

คำตอบ:


25

ไม่ต้นไม้ไบนารีไม่ได้มีไว้สำหรับจัดเก็บข้อมูลแบบลำดับชั้นในแง่ที่คุณคิด กรณีการใช้งานหลักสำหรับต้นไม้ n-ary ซึ่งnเป็นหมายเลขคงที่คือความสามารถในการค้นหาที่รวดเร็วไม่ใช่ลำดับชั้นของความหมาย

จำเกมเก่าที่คนคนหนึ่งคิดเลขระหว่าง 1 ถึง 100 และอีกคนต้องเดาให้น้อยที่สุดเท่าที่จะเป็นไปได้และถ้าคุณเดาผิดคนที่คิดเลขนั้นจะต้องบอกคุณว่าคุณเอง สูงหรือต่ำเกินไป มันน่าเบื่อไปซักพักนึงเพราะคุณคิดว่าคุณควรเริ่มต้นที่ 50 เสมอแล้วไปที่ 25 หรือ 75 และแบ่งช่วงเพื่อค้นหาครึ่งโดยเดาใหม่แต่ละครั้งหลังจากนั้นและในที่สุดคุณก็สามารถเดาตัวเลขใดก็ได้ มีการคาดเดาได้มากที่สุด 7 ครั้ง

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


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

1
@ sw123456: ถูกต้อง เช่นเดียวกับวิศวกรรมใด ๆ มันมาพร้อมกับการแลกเปลี่ยน (ใช้หน่วยความจำมากกว่า - และกระจัดกระจายมากกว่าอาร์เรย์ที่มีจำนวนองค์ประกอบเท่ากันการเข้าถึง O (n) ไปยังองค์ประกอบ #n ของชุดข้อมูลแทนที่จะเป็น O (1) การเข้าถึง ฯลฯ ) แต่การค้นหาที่รวดเร็วนั้นเป็นข้อได้เปรียบที่สำคัญของต้นไม้ไบนารี
Mason Wheeler

@ sw123456 ดีใจที่ฉันสามารถช่วยอธิบายได้ :)
เมสันล้อ

3
การเข้าถึงองค์ประกอบคือ O (log (n)) เมื่อต้นไม้มีความสมดุล O (n) จะเป็นกรณีที่เลวร้ายที่สุดเมื่อมีการเสื่อมสภาพ (โหนดส่วนใหญ่ที่มีวงเล็บเพียงหนึ่ง)
Mandrill

@ sw123456 การกำหนดเส้นทางเครือข่ายใช้การปรับเปลี่ยนเล็กน้อยของต้นไม้ไบนารีที่เรียกว่า Trie (สร้างขึ้นเพื่อประสิทธิภาพมากขึ้นสำหรับโดเมนปัญหา) จริง ๆ แล้วมันเก็บข้อมูลลำดับชั้นในขณะที่เราเตอร์สำรวจต้นไม้ทีละบิตเมื่อค้นหาที่อยู่ IP เพื่อค้นหาตำแหน่งที่มันควรส่งต่อแพ็คเก็ต ที่อยู่ IP นั้นเป็นไปตามลำดับชั้นตามธรรมชาติดังนั้นในการสำรวจ IP เพื่อค้นหาคำนำหน้าที่ยาวที่สุดตรงกันเราเตอร์กำลังสำรวจลำดับชั้น IP, IP ซับเน็ตย่อย ฯลฯ ไม่ชัดเจนในเชิงความหมาย แต่มีความสัมพันธ์อยู่ที่นั่น เราเตอร์ใช้โครงสร้างนี้เพื่อประสิทธิภาพการค้นหาตามที่เมสันตอบ
Chris Cirefice

3

โครงสร้างต้นไม้ใด ๆ ที่โหนดสามารถมีจำนวนลูกไม่ จำกัด สามารถดำเนินการได้โดยใช้ต้นไม้ไบนารี

สำหรับแต่ละโหนดในทรีของคุณให้แทนที่ด้วยโหนดด้วยตัวชี้ด้านขวาและซ้าย ตัวชี้ซ้ายไปที่ลูกคนแรกของโหนด โหนดที่ถูกต้องไปที่พี่น้องถัดไปของโหนด ชายด์ทั้งหมดของโหนดที่ระบุอยู่ในรายการที่เชื่อมโยงเข้าร่วมโดยตัวชี้ด้านขวาโดยส่วนหัวของรายการที่ชี้โดยตัวชี้ซ้ายของพาเรนต์

ต้นไม้ n-ary ที่ซับซ้อนของคุณได้กลายเป็นต้นไม้ไบนารีที่เรียบง่าย

ฉันแน่ใจว่านี่เป็น Knuth ฉบับ 1 ที่ไหนสักแห่ง


นี่เป็นการใช้งานที่น่าสนใจจริงๆ ฉันคิดถูกแล้วเพราะโหนดลูกแต่ละอันเป็นจุดเริ่มต้นของลิสต์ที่เชื่อมโยงต้นไม้จะไม่เป็น O (บันทึก) n) ถ้าสมดุลหรือ O (n) ถ้าไม่เนื่องจากการไปที่แต่ละโหนดจะเริ่มต้นขึ้น ปิดการค้นหาเชิงเส้น? การใช้งานนี้จะส่งผลให้เวลาในการค้นหาช้าลงมาก? แต่ในทางกลับกันเวลาในการค้นหาจะเร็วกว่าโครงสร้างเชิงเส้นมาตรฐานหรือไม่ ฉันเข้าใจถูกต้องหรือไม่
sw123456

@ sw123456 หากต้นไม้ต้นเดิมมีความสมดุลต้นไม้ไบนารีที่เกิดขึ้นแทบจะไม่แน่นอน ฉันเชื่อว่าทุกสิ่งทุกอย่างจะขึ้นอยู่กับพัดลมจากต้นไม้ว่ามีโหนดใดบ้างที่มีอยู่ การค้นหาเชิงเส้นจะเกิดขึ้นเฉพาะเมื่อค้นหาว่าโหนดใดของโหนดที่กำหนดที่จะติดตาม แต่ฉันไม่แน่ใจว่าคุณสามารถหลีกเลี่ยงได้ในการใช้งานต้นไม้ n-ary
Justsalt

2

ทำไมต้องใช้ต้นไม้ไบนารี

ในการเขียนโปรแกรมคุณทำงานเป็นจำนวนมากด้วยการรวบรวมข้อมูลประเภทเดียวกัน

วิธีพื้นฐานสองวิธีในการเก็บข้อมูลนี้คือ: รายการที่เชื่อมโยงและอาร์เรย์

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

  • ไม่สามารถค้นหาได้อย่างมีประสิทธิภาพ แต่การแทรกและการลบนั้นง่าย

ด้วยการเข้าถึงอาร์เรย์ขององค์ประกอบที่เฉพาะเจาะจงนั้นเป็นเรื่องง่าย แต่การแทรกหรือลบองค์ประกอบนั้นยากกว่าเพราะการแทรกหมายถึง: ขยายอาร์เรย์ทีละหนึ่งเลื่อนองค์ประกอบทั้งหมดก่อนที่จะแทรกตำแหน่งที่ 1 ไปทางขวาและแทรกองค์ประกอบ

  • มันค้นหาอย่างมีประสิทธิภาพ (ถ้าเรียงลำดับ) แต่การแทรกและการลบนั้นยาก

ดังนั้นทั้งรายการที่เชื่อมโยงและอาร์เรย์จึงมีข้อเสีย

ต้นไม้ไบนารีถูกสร้างขึ้นเพื่อจัดการกับปัญหาทั้งสองของอาร์เรย์และรายการที่เชื่อมโยง:

  1. แทรกและลบได้ง่าย
  2. ค้นหาง่าย

ดังนั้นต้นไม้ไบนารีจะเกิดขึ้นเมื่อคุณมีข้อมูลจำนวนมากซึ่งมีการเปลี่ยนแปลงเป็นประจำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.