ฮีปและ BST แตกต่างกันอย่างไร
เมื่อใดจึงควรใช้ฮีปและเมื่อใช้ BST
ถ้าคุณต้องการที่จะได้รับองค์ประกอบในการเรียงลำดับ BST จะดีกว่ากอง?
ฮีปและ BST แตกต่างกันอย่างไร
เมื่อใดจึงควรใช้ฮีปและเมื่อใช้ BST
ถ้าคุณต้องการที่จะได้รับองค์ประกอบในการเรียงลำดับ BST จะดีกว่ากอง?
คำตอบ:
สรุป
Type BST (*) Heap
Insert average log(n) 1
Insert worst log(n) log(n) or n (***)
Find any worst log(n) n
Find max worst 1 (**) 1
Create worst n log(n) n
Delete worst log(n) log(n)
เวลาเฉลี่ยทั้งหมดในตารางนี้เท่ากับเวลาที่แย่ที่สุดยกเว้นการแทรก
*
: ทุกที่ในคำตอบนี้ BST == สมดุล BST เนื่องจากความไม่สมดุลจะดูด asymptotically**
: การใช้การดัดแปลงเล็กน้อยอธิบายในคำตอบนี้***
: log(n)
สำหรับทรีของตัวชี้ฮีปn
สำหรับฮีปอาร์เรย์แบบไดนามิกข้อดีของไบนารีฮีปผ่าน BST
แทรกเวลาเฉลี่ยเป็นกองไบนารีO(1)
สำหรับ BST O(log(n))
เป็น นี่คือคุณสมบัตินักฆ่าของกอง
นอกจากนี้ยังมีฮีปอื่น ๆ ที่มีค่าเสื่อมราคาO(1)
(แข็งแกร่งขึ้น) เช่นFibonacci Heapและแม้แต่กรณีที่เลวร้ายที่สุดเช่นคิว Brodalถึงแม้ว่ามันอาจจะไม่สามารถนำไปใช้ได้จริงเพราะประสิทธิภาพที่ไม่ใช่เชิงเส้นประสาท : ฟีโบนัชชีฮีปหรือคิว Brodal ใช้ในทางปฏิบัติหรือไม่?
สามารถใช้ไบนารีฮีปได้อย่างมีประสิทธิภาพที่ด้านบนของอาร์เรย์แบบไดนามิกหรือแผนภูมิแบบอิงพอยน์เตอร์, ต้นไม้ BST เท่านั้น ดังนั้นสำหรับฮีปเราสามารถเลือกการปรับใช้อาเรย์ที่มีประสิทธิภาพมากขึ้นถ้าเราสามารถจ่ายค่าเวลาในการปรับขนาดได้เป็นครั้งคราว
สร้างกองไบนารีเป็นO(n)
กรณีที่เลวร้ายที่สุด , O(n log(n))
สำหรับ BST
ข้อได้เปรียบของ BST มากกว่าไบนารีฮีป
O(log(n))
ค้นหาสำหรับองค์ประกอบโดยพลการเป็น นี่คือคุณสมบัตินักฆ่าของ BST
สำหรับกองมันเป็นโดยทั่วไปยกเว้นสำหรับองค์ประกอบที่ใหญ่ที่สุดซึ่งเป็นO(n)
O(1)
ข้อได้เปรียบ "เท็จ" ของกองมากกว่า BST
กองคือO(1)
จะหา max, O(log(n))
BST
นี่เป็นความเข้าใจผิดที่พบบ่อยเพราะมันเป็นเรื่องเล็กน้อยที่จะแก้ไข BST เพื่อติดตามองค์ประกอบที่ใหญ่ที่สุดและอัปเดตเมื่อใดก็ตามที่องค์ประกอบนั้นสามารถเปลี่ยนแปลงได้: ในการแทรกของ swap ที่ใหญ่กว่าในการลบค้นหาที่ใหญ่เป็นอันดับสอง เราสามารถใช้แผนภูมิการค้นหาแบบไบนารีเพื่อจำลองการทำงานของฮีปได้หรือไม่ (พูดถึงโดย Yeo )
ที่จริงแล้วนี่เป็นข้อ จำกัดของฮีปเมื่อเปรียบเทียบกับ BST: การค้นหาที่มีประสิทธิภาพเพียงอย่างเดียวคือสำหรับองค์ประกอบที่ใหญ่ที่สุด
ค่าเฉลี่ยของการแทรกฮีปไบนารีคือ O(1)
แหล่งที่มา:
อาร์กิวเมนต์ที่ใช้งานง่าย:
ใน binary heap การเพิ่มค่าที่ดัชนีที่กำหนดนั้นก็O(1)
เป็นเช่นเดียวกัน แต่ถ้าคุณต้องการทำเช่นนั้นเป็นไปได้ว่าคุณต้องการเก็บดัชนีพิเศษล่าสุดเกี่ยวกับการดำเนินการฮีปวิธีการดำเนินการลดคีย์ O (บันทึก) สำหรับคิวลำดับความสำคัญขั้นต่ำ เช่น Dijkstra เป็นไปได้โดยไม่มีค่าใช้จ่ายเพิ่มเติม
ไลบรารีมาตรฐาน GCC C ++ แทรกมาตรฐานในฮาร์ดแวร์จริง
ฉันเปรียบเทียบ C + + std::set
( ต้นไม้สีแดง - ดำ BST ) และstd::priority_queue
( ไดนามิกอาร์เรย์ฮีป ) แทรกเพื่อดูว่าฉันถูกเกี่ยวกับเวลาแทรกและนี่คือสิ่งที่ฉันได้รับ:
ชัดเจน:
เวลาแทรกฮีปเป็นค่าคงที่โดยทั่วไป
เราสามารถเห็นคะแนนการปรับขนาดอาร์เรย์แบบไดนามิกได้อย่างชัดเจน เนื่องจากเรากำลังเฉลี่ยเม็ดมีดทุก ๆ 10k ที่สามารถมองเห็นสิ่งต่าง ๆ ได้จากสัญญาณรบกวนของระบบทั้งหมดยอดเขาเหล่านั้นจึงมีขนาดใหญ่กว่าที่แสดงจริงประมาณ 10k เท่า!
กราฟที่ซูมไม่รวมถึงการปรับขนาดของอาเรย์เท่านั้นและแสดงให้เห็นว่าเม็ดมีดเกือบทั้งหมดอยู่ในระดับต่ำกว่า 25 นาโนวินาที
BST เป็นลอการิทึม เม็ดมีดทั้งหมดจะช้ากว่าเม็ดมีดทั่วไปมาก
การวิเคราะห์รายละเอียด BST vs hashmap ที่: โครงสร้างข้อมูลใดอยู่ใน std :: map ใน C ++?
ไลบรารีมาตรฐาน GCC C ++ แทรกมาตรฐานใน gem5
gem5m5 dumpstats
เป็นโปรแกรมจำลองระบบเต็มรูปแบบและดังนั้นจึงยังมีนาฬิกาที่ถูกต้องเพียบด้วยกับ ดังนั้นฉันจึงลองใช้มันเพื่อประเมินการกำหนดเวลาสำหรับเม็ดมีดแต่ละใบ
การตีความ:
กองยังคงไม่เปลี่ยนแปลง แต่ตอนนี้เราเห็นรายละเอียดเพิ่มเติมว่ามีเพียงไม่กี่บรรทัดและแต่ละบรรทัดที่สูงขึ้นจะกระจัดกระจายมากขึ้น
สิ่งนี้จะต้องสอดคล้องกับเวลาในการเข้าถึงหน่วยความจำที่ทำได้สำหรับเม็ดมีดที่สูงขึ้นและสูงขึ้น
สิ่งที่ต้องทำฉันไม่สามารถตีความ BST อย่างเต็มที่เพราะมันไม่ได้ดูลอการิทึมและค่อนข้างคงที่
ด้วยรายละเอียดที่ยิ่งใหญ่กว่านี้ แต่เราสามารถเห็นได้ว่ามีเส้นที่แตกต่างกันสองสามอัน แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร: ฉันคาดว่าบรรทัดล่างจะบางกว่าเนื่องจากเราแทรกด้านบนสุด
เทียบกับเรื่องนี้ติดตั้ง Buildrootบน aarch64 CPU HPI
BST ไม่สามารถนำไปใช้อย่างมีประสิทธิภาพในอาเรย์
การดำเนินการฮีปจำเป็นต้องทำให้ฟองขึ้นหรือลงที่กิ่งต้นไม้เดียวดังนั้นค่าเฉลี่ยของO(log(n))
กรณีที่เลวร้ายที่สุดO(1)
การรักษาความสมดุล BST นั้นต้องใช้การหมุนต้นไม้ซึ่งสามารถเปลี่ยนองค์ประกอบยอดนิยมสำหรับอีกอันหนึ่งได้และจะต้องย้ายอาร์เรย์ทั้งหมดไปรอบ ๆ ( O(n)
)
สามารถใช้ Heaps ได้อย่างมีประสิทธิภาพในอาเรย์
ผู้ปกครองและเด็กดัชนีสามารถคำนวณได้จากดัชนีปัจจุบันเป็นที่แสดงที่นี่
ไม่มีการดำเนินการที่สมดุลเช่น BST
ลบนาทีเป็นการดำเนินการที่น่าเป็นห่วงที่สุดเนื่องจากจะต้องเลื่อนจากบนลงล่าง แต่มันก็สามารถทำได้โดยการ "แทรกซึมลง" สาขาเดียวของกองตามที่อธิบายไว้ที่นี่ สิ่งนี้นำไปสู่กรณีที่เลวร้ายที่สุด O (บันทึก (n)) เนื่องจากฮีปมีความสมดุลที่ดีเสมอ
หากคุณกำลังแทรกโหนดเดียวสำหรับทุก ๆ โหนดที่คุณลบคุณจะเสียความได้เปรียบของการแทรกเฉลี่ยแบบ asymptotic O (1) ที่ฮีปมีให้ซึ่งการลบจะมีอิทธิพลเหนือและคุณอาจใช้ BST อย่างไรก็ตาม Dijkstra อัพเดตโหนดหลายครั้งสำหรับการลบแต่ละครั้งดังนั้นเราจึงใช้ได้
ฮีปของอาร์เรย์แบบไดนามิกเทียบกับทรีของพอยเตอร์ทริก
สามารถนำHeap ไปใช้อย่างมีประสิทธิภาพที่ด้านบนของheapตัวชี้: เป็นไปได้หรือไม่ที่จะทำให้การปรับใช้ heap แบบไบนารีบนตัวชี้มีประสิทธิภาพ?
การใช้อาเรย์แบบไดนามิกนั้นมีพื้นที่มากขึ้น สมมติว่าแต่ละองค์ประกอบของฮีปประกอบด้วยเพียงตัวชี้ไปที่struct
:
การใช้งานทรีต้องเก็บพอยน์เตอร์สามตัวสำหรับแต่ละองค์ประกอบ: parent, child child และ right child ดังนั้นการใช้หน่วยความจำจึงเป็นตลอดเวลา4n
(3 พอยน์เตอร์พอยน์เตอร์ + 1 พอยน์เตอร์struct
)
Tree BSTs ต้องการข้อมูลเพิ่มเติมเช่นสมดุลสีดำ - แดง - เนส
การใช้งานอาร์เรย์แบบไดนามิกอาจมีขนาด2n
หลังจากเพิ่มขึ้นสองเท่า 1.5n
ดังนั้นโดยเฉลี่ยจะเป็นไปได้
ในทางตรงกันข้ามต้นไม้กองมีแทรกกรณีที่เลวร้ายที่สุดที่ดีกว่าเนื่องจากการคัดลอกอาร์เรย์แบบไดนามิกการสำรองเพื่อสองเท่าของขนาดใช้O(n)
กรณีที่เลวร้ายที่สุดในขณะที่ต้นไม้กองเพียงแค่การจัดสรรใหม่ขนาดเล็กสำหรับแต่ละโหนด
อย่างไรก็ตามอาร์เรย์สำรองสองเท่าจะถูกO(1)
ตัดจำหน่ายดังนั้นจึงพิจารณาถึงความล่าช้าสูงสุด กล่าวถึงที่นี่
ปรัชญา
BSTs รักษาทรัพย์สินส่วนกลางระหว่างผู้ปกครองและผู้สืบทอดทั้งหมด (เหลือน้อยกว่าใหญ่กว่า)
โหนดบนสุดของ BST เป็นองค์ประกอบกลางซึ่งต้องการความรู้ทั่วโลกในการบำรุงรักษา (รู้จำนวนองค์ประกอบที่เล็กและใหญ่กว่า)
สถานที่ให้บริการส่วนกลางนี้มีราคาแพงกว่าในการรักษา (แทรกบันทึก n) แต่ให้การค้นหาที่มีประสิทธิภาพมากขึ้น (ค้นหาบันทึก n)
กองรักษาทรัพย์สินในท้องถิ่นระหว่างผู้ปกครองและเด็กโดยตรง (ผู้ปกครอง> เด็ก)
โหนดบนสุดของฮีปคือองค์ประกอบขนาดใหญ่ซึ่งต้องการเพียงความรู้ในท้องถิ่นในการบำรุงรักษา (การรู้จักผู้ปกครองของคุณ)
เปรียบเทียบ BST กับฮีปเทียบกับ Hashmap:
BST: อาจเป็นได้ทั้ง:
heap: เป็นเพียงเครื่องคัดแยก ไม่สามารถเป็นชุดที่ไม่มีการเรียงลำดับที่มีประสิทธิภาพเนื่องจากคุณสามารถตรวจสอบองค์ประกอบที่เล็กที่สุด / ใหญ่ที่สุดได้อย่างรวดเร็วเท่านั้น
แฮชแผนที่: สามารถเป็นชุดที่ไม่มีการเรียงลำดับเท่านั้นไม่ใช่เครื่องคัดแยกที่มีประสิทธิภาพเนื่องจากการแฮชจะรวมการเรียงลำดับใด ๆ
รายการที่ลิงก์ทวีคูณ
รายการที่เชื่อมโยงเป็นทวีคูณสามารถเห็นได้เป็นส่วนย่อยของฮีปที่รายการแรกมีลำดับความสำคัญมากที่สุดดังนั้นให้เปรียบเทียบที่นี่ด้วย:
O(1)
กรณีที่แย่ที่สุดเนื่องจากเรามีตัวชี้ไปยังรายการต่างๆและการอัปเดตนั้นง่ายมากO(1)
เฉลี่ยจึงแย่กว่ารายการที่เชื่อมโยง แลกเปลี่ยนสิ่งที่มีตำแหน่งแทรกทั่วไปเพิ่มเติมO(n)
สำหรับทั้งคู่กรณีการใช้งานสำหรับกรณีนี้คือเมื่อคีย์ของฮีปคือการประทับเวลาปัจจุบัน: ในกรณีนั้นรายการใหม่จะไปที่จุดเริ่มต้นของรายการเสมอ ดังนั้นเราสามารถลืมการประทับเวลาที่แน่นอนทั้งหมดและเพียงแค่รักษาตำแหน่งในรายการเป็นลำดับความสำคัญ
สิ่งนี้สามารถใช้เพื่อนำแคช LRUไปใช้ เช่นเดียวกับแอปพลิเคชันฮีปเช่น Dijkstraคุณจะต้องเก็บ hashmap เพิ่มเติมจากคีย์ไปยังโหนดที่เกี่ยวข้องของรายการเพื่อค้นหาว่าโหนดใดที่ต้องอัปเดตอย่างรวดเร็ว
เปรียบเทียบ BST ที่สมดุลต่างกัน
ถึงแม้ว่าการแทรกเชิงเส้นกำกับและค้นหาเวลาสำหรับโครงสร้างข้อมูลทั้งหมดที่จัดอยู่ในประเภท "สมดุล BSTs" ที่ฉันเคยเห็นมาแล้วนั้นเหมือนกัน BBSTs ที่แตกต่างกันมีการแลกเปลี่ยนที่แตกต่างกัน ฉันยังไม่ได้ศึกษาอย่างเต็มที่ แต่ก็เป็นการดีที่จะสรุปการแลกเปลี่ยนเหล่านี้ที่นี่:
ดูสิ่งนี้ด้วย
คำถามที่คล้ายกันใน CS: /cs/27860/whats-the-difference-between-a-binary-search-tree-and-a-binary-heap
ฮีปจะรับประกันว่าองค์ประกอบในระดับที่สูงกว่านั้นจะใหญ่กว่า (สำหรับแม็กซ์ฮีป) หรือเล็กกว่า (สำหรับมิน - ฮีป) กว่าองค์ประกอบในระดับที่ต่ำกว่าในขณะที่ BST รับประกันคำสั่ง (จาก "ซ้าย" ถึง "ขวา") ถ้าคุณต้องการเรียงองค์ประกอบไปด้วย BST
[1, 5, 9, 7, 15, 10, 11]
แสดงถึง min-heap ที่ถูกต้อง แต่7
ในระดับ 3 มีขนาดเล็กกว่า9
ระดับ 2 สำหรับการสร้างภาพข้อมูลให้ดูตัวอย่างเช่น25
และ19
องค์ประกอบในภาพ Wikipedia สำหรับตัวอย่าง (โปรดทราบว่าความสัมพันธ์ที่ไม่เท่าเทียมกันระหว่างองค์ประกอบนั้นไม่เข้มงวดเนื่องจากองค์ประกอบไม่จำเป็นต้องมีความซ้ำกัน)
เมื่อใดจึงควรใช้ฮีปและเมื่อใช้ BST
ฮีปดีกว่าที่ findMin / findMax ( O(1)
) ในขณะที่ BST นั้นดีในการค้นหาทั้งหมด ( O(logN)
) ส่วนแทรกO(logN)
สำหรับทั้งสองโครงสร้าง หากคุณสนใจเกี่ยวกับ findMin / findMax (เช่นลำดับความสำคัญที่เกี่ยวข้อง) ให้ไปกับ heap ถ้าคุณต้องการเรียงทุกอย่างไปด้วย BST
สองสามสไลด์แรกจากที่นี่อธิบายสิ่งต่าง ๆ อย่างชัดเจน
Heap สามารถทำได้findMin
หรือ findMax
ใน O (1) แต่ไม่ใช่ทั้งสองอย่างในโครงสร้างข้อมูลเดียวกัน อย่างไรก็ตามฉันไม่เห็นว่าฮีปจะดีกว่าใน findMin / findMax ในความเป็นจริงด้วยการปรับเปลี่ยนเล็กน้อย BST สามารถทำได้ทั้ง ในfindMin
และ findMax
O (1)
ใน BST ที่ถูกปรับเปลี่ยนนี้คุณจะติดตามโหนดขั้นต่ำและโหนดสูงสุดทุกครั้งที่คุณทำการดำเนินการที่อาจแก้ไขโครงสร้างข้อมูลได้ ตัวอย่างเช่นในการดำเนินการแทรกคุณสามารถตรวจสอบว่าค่า min มีค่ามากกว่าค่าที่แทรกใหม่จากนั้นกำหนดค่า min ให้กับโหนดที่เพิ่มใหม่ สามารถใช้เทคนิคเดียวกันนี้กับค่าสูงสุด ดังนั้น BST นี้มีข้อมูลเหล่านี้ซึ่งคุณสามารถเรียกดูได้ใน O (1) (เช่นเดียวกับไบนารีฮีป)
ใน BST นี้ (สมดุล BST) เมื่อคุณpop min
หรือpop max
ค่าขั้นต่ำถัดไปที่จะได้รับมอบหมายคือผู้สืบทอดของโหนดขั้นต่ำในขณะที่ค่าสูงสุดต่อไปที่จะกำหนดเป็นบรรพบุรุษของโหนดสูงสุด ดังนั้นมันจึงทำงานใน O (1) อย่างไรก็ตามเราจำเป็นต้องปรับสมดุลต้นไม้ดังนั้นมันจะยังคงทำงาน O (บันทึก n) (เช่นเดียวกับไบนารีฮีป)
ฉันสนใจที่จะรับฟังความคิดเห็นของคุณในความคิดเห็นด้านล่าง ขอบคุณ :)
การอ้างอิงโยงกับคำถามที่คล้ายกันเราสามารถใช้แผนภูมิการค้นหาแบบไบนารีเพื่อจำลองการทำงานของฮีปได้หรือไม่ สำหรับการอภิปรายเพิ่มเติมเกี่ยวกับการจำลองฮีปโดยใช้ BST
popMin
หรือpopMax
ไม่ใช่ O (1) แต่เป็น O (log n) เนื่องจากต้องเป็น Balanced BST ซึ่งจำเป็นต้องปรับสมดุลทุกการลบ ดังนั้นมันจึงเหมือนกับ binary heap popMin
หรือpopMax
ที่เรียกใช้ O (log n)
แผนผังการค้นหาแบบไบนารี่ใช้คำนิยาม: สำหรับทุกโหนดโหนดทางด้านซ้ายของมันจะมีค่าน้อยกว่า (คีย์) และโหนดทางด้านขวาของมันมีค่าที่มากกว่า (คีย์)
ในกรณีที่เป็นฮีปการดำเนินการของต้นไม้ไบนารีจะใช้คำจำกัดความต่อไปนี้
ถ้า A และ B เป็นโหนดโดยที่ B คือโหนดลูกของ A ดังนั้นค่า (คีย์) ของ A ต้องมากกว่าหรือเท่ากับค่า (คีย์) ของ B นั่นคือคีย์ (A) ≥คีย์ (B) )
http://wiki.answers.com/Q/Difference_between_binary_search_tree_and_heap_tree
วันนี้ฉันวิ่งแข่งกับคำถามเดียวกันเพื่อสอบและทำถูกต้อง รอยยิ้ม ... :)
การใช้ BST มากกว่าฮีปอีกครั้ง เพราะความแตกต่างที่สำคัญ:
การใช้ BST เป็นฮีป : ตอนนี้ให้บอกว่าเราใช้โครงสร้างข้อมูลเพื่อเก็บเวลาลงจอดของเที่ยวบิน เราไม่สามารถกำหนดเที่ยวบินไปยังดินแดนได้หากความแตกต่างของเวลาลงจอดนั้นน้อยกว่า 'd' และสมมติว่ามีเที่ยวบินจำนวนมากถูกกำหนดให้ลงจอดในโครงสร้างข้อมูล (BST หรือ Heap)
ตอนนี้เราต้องการที่จะจัดตารางเวลาเที่ยวบินซึ่งจะจอดที่อีกที ดังนั้นเราจำเป็นต้องคำนวณความแตกต่างของtกับตัวตายตัวแทนและบรรพบุรุษ (ควร> d) ดังนั้นเราจะต้องการ BST สำหรับสิ่งนี้ซึ่งทำได้อย่างรวดเร็วเช่นใน O (logn) หากมีความสมดุล
แก้ไข:
การเรียงลำดับ BST ใช้เวลา O (n) ในการพิมพ์องค์ประกอบในลำดับที่เรียง (การข้ามผ่าน Inorder) ในขณะที่ Heap สามารถทำได้ในเวลา O (n logn) ฮีปจะแยกองค์ประกอบขั้นต่ำและทำการจัดเรียงอาเรย์อีกครั้งซึ่งจะทำการเรียงลำดับในเวลา O (n logn)
from unsorted to sorted sequence. O(n) time for inorder traversal of a BST, which gives sorted sequence.
ทีนี้จากลำดับที่ไม่เรียงลำดับไปจนถึง BST ฉันไม่รู้วิธีที่อิงการเปรียบเทียบคีย์กับเวลาน้อยกว่า O (n logn) ซึ่งครอบงำ BST ไปเป็นส่วนลำดับ (ในขณะที่มีการก่อสร้างกอง O (n)) ฉันคิดว่ามันยุติธรรม (ถ้าไม่มีจุดหมาย) เพื่อระบุว่ากองอยู่ใกล้กับไม่เรียงลำดับและเรียงลำดับ BST
แทรกองค์ประกอบทั้งหมด n จากอาร์เรย์ไปยัง BST ใช้เวลา O (n logn) n elemnts ในอาเรย์สามารถแทรกเข้าไปใน heap ในเวลา O (n) ซึ่งทำให้ได้เปรียบแน่นอน
กองเพียงแค่รับประกันว่าองค์ประกอบในระดับที่สูงกว่าจะมากขึ้น (สำหรับ max-heap) หรือเล็กกว่า (สำหรับ min-heap) กว่าองค์ประกอบในระดับที่ต่ำกว่า
ฉันชอบคำตอบข้างต้นและใส่ความคิดเห็นของฉันเฉพาะเจาะจงมากขึ้นกับความต้องการและการใช้งานของฉัน ฉันต้องขอรายชื่อตำแหน่ง n ค้นหาระยะทางจากสถานที่แต่ละแห่งไปยังจุดเฉพาะบอกว่า (0,0) จากนั้นคืนตำแหน่ง am ที่มีระยะทางน้อยกว่า ฉันใช้ Priority Queue ซึ่งเป็น Heap สำหรับการค้นหาระยะทางและการวางกองมันเอาฉัน n (บันทึก (n)) n-location บันทึก (n) การแทรกแต่ละครั้ง จากนั้นสำหรับการหา m ด้วยระยะทางที่สั้นที่สุดมันใช้ m (log (n)) m-location บันทึก (n) การลบ heap up
ฉันถ้าจะต้องทำกับ BST มันจะเอาฉัน n (n) กรณีที่เลวร้ายที่สุดแทรก (พูดว่าค่าแรกมีขนาดเล็กมากและอื่น ๆ ทั้งหมดมาเรียงตามลำดับอีกต่อไปและอีกต่อไปและต้นไม้ครอบคลุมเด็กขวาหรือซ้ายเด็ก ในกรณีที่เล็กกว่าและเล็กกว่านาทีจะใช้เวลา O (1) แต่อีกครั้งฉันต้องสร้างความสมดุลดังนั้นจากสถานการณ์ของฉันและเหนือคำตอบสิ่งที่ฉันได้รับคือเมื่อคุณอยู่หลังจากค่าที่ต่ำสุดหรือตามลำดับความสำคัญสูงสุดไป สำหรับกอง