คำถามติดแท็ก binary-trees

ต้นไม้ที่แต่ละโหนดมีลูกไม่เกินสองลูก

2
BIT: สัญชาตญาณที่อยู่เบื้องหลังต้นไม้ดัชนีแบบไบนารีคืออะไรและคิดอย่างไร?
ต้นไม้ดัชนีแบบไบนารีมีวรรณกรรมน้อยมากหรือค่อนข้างน้อยเมื่อเทียบกับโครงสร้างข้อมูลอื่น ๆ สถานที่เดียวซึ่งจะมีการเรียนการสอนเป็นTopCoder กวดวิชา แม้ว่าการสอนจะเสร็จสมบูรณ์ในคำอธิบายทั้งหมด แต่ฉันไม่สามารถเข้าใจสัญชาตญาณที่อยู่เบื้องหลังต้นไม้เช่นนั้นได้หรือไม่ มันถูกคิดค้นขึ้นมาได้อย่างไร? หลักฐานที่แท้จริงของความถูกต้องคืออะไร?

5
ความแตกต่างระหว่างแผนภูมิการค้นหาแบบไบนารี่และฮีปแบบไบนารีคืออะไร
ทั้งสองดูเหมือนกันมากและมีโครงสร้างเกือบเหมือนกัน ความแตกต่างคืออะไร? ความซับซ้อนของเวลาสำหรับการดำเนินงานที่แตกต่างกันของแต่ละคนคืออะไร

2
ต้นไม้สีแดงดำทุกต้นไม่สมดุลหรือไม่
โดยสัญชาตญาณ "ต้นไม้ที่สมดุล" ควรเป็นต้นไม้ที่ต้นไม้ย่อยด้านซ้ายและขวาในแต่ละโหนดจะต้องมีจำนวนโหนดโดยประมาณเท่ากัน แน่นอนเมื่อเราพูดถึงต้นไม้สีแดงดำ * (ดูคำจำกัดความที่ท้าย) การมีความสมดุลจริง ๆ แล้วเราหมายถึงว่าพวกเขามีความสูงที่สมดุลและในแง่นั้นพวกเขามีความสมดุล สมมติว่าเราพยายามทำสัญชาตญาณข้างต้นเป็นระเบียบดังนี้: คำนิยาม:ต้นไม้ไบนารีเรียกว่า -balance, โดยมี , สำหรับทุกโหนด , ความไม่เท่าเทียมกันμμ\mu0≤μ≤120≤μ≤120 \le \mu \leq \frac{1}{2}NNN μ≤|NL|+1|N|+1≤1−μμ≤|NL|+1|N|+1≤1−μ \mu \le \frac{|N_L| + 1}{|N| + 1} \le 1 - \mu เก็บและสำหรับทุก ๆมีบางโหนดที่คำสั่งข้างต้นล้มเหลว คือจำนวนโหนดในทรีย่อยด้านซ้ายของและคือจำนวนโหนดใต้ต้นไม้ที่มีเป็นรูท (รวมถึงรูท)μ′>μμ′>μ\mu' \gt \mu|NL||NL||N_L|NNN|N||N||N|NNN ฉันเชื่อว่าสิ่งเหล่านี้เรียกว่าต้นไม้ที่มีน้ำหนักสมดุลในวรรณกรรมบางเล่มในหัวข้อนี้ ใคร ๆ ก็สามารถแสดงให้เห็นว่าถ้าต้นไม้ไบนารีกับ nodes คือ -balanced (สำหรับค่าคงที่ ) ดังนั้นความสูงของต้นไม้คือดังนั้นจึงคงการค้นหาที่ดี คุณสมบัติ.nnnμμ\muμ>0μ>0\mu …

1
ตารางแฮชกับต้นไม้ไบนารี
เมื่อติดตั้งพจนานุกรม ('ฉันต้องการค้นหาข้อมูลลูกค้าตามรหัสลูกค้า') โครงสร้างข้อมูลทั่วไปที่ใช้คือตารางแฮชและแผนภูมิการค้นหาแบบไบนารี ฉันรู้ว่าอินสแตนซ์ที่ห้องสมุด C ++ STL ใช้พจนานุกรม (เรียกพวกเขาว่าแผนที่) โดยใช้แผนภูมิการค้นหาแบบทวิภาค (สมดุล) และกรอบงาน. NET ใช้ตารางแฮชภายใต้ประทุน ข้อดีและข้อเสียของโครงสร้างข้อมูลเหล่านี้คืออะไร มีตัวเลือกอื่นที่เหมาะสมในบางสถานการณ์หรือไม่? โปรดทราบว่าฉันไม่สนใจโดยเฉพาะอย่างยิ่งในกรณีที่ปุ่มมีโครงสร้างพื้นฐานที่แข็งแกร่งกล่าวว่าพวกเขาเป็นจำนวนเต็มทั้งหมดระหว่าง 1 ถึง n หรือบางสิ่งบางอย่าง

1
การรวมกันของลำดับก่อนหลังโพสต์และลำดับที่ไม่ซ้ำกัน?
เรารู้ว่าโพสต์ - สั่ง post L(x) => [x] post N(x,l,r) => (post l) ++ (post r) ++ [x] และสั่งซื้อล่วงหน้า pre L(x) => [x] pre N(x,l,r) => [x] ++ (pre l) ++ (pre r) และการแวะผ่านตามลำดับ sequentialisation in L(x) => [x] in N(x,l,r) => (in l) ++ [x] ++ (in r) เราสามารถเห็นได้อย่างง่ายดายว่าไม่ได้อธิบายต้นไม้ที่ให้มาโดยเฉพาะแม้ว่าเราจะถือว่าคีย์ / …

2
การนับต้นไม้ไบนารี
(ฉันเป็นนักเรียนที่มีพื้นฐานทางคณิตศาสตร์และฉันต้องการทราบวิธีนับจำนวนต้นไม้ไบนารีที่เฉพาะเจาะจง) เมื่อดูที่หน้า Wikipedia สำหรับBinary Treesฉันได้สังเกตการยืนยันนี้ว่าจำนวนต้นไม้ไบนารีที่รูทขนาดจะเป็นจำนวนคาตาลันนี้: C_n = \ dfrac {1} {n + 1} {2n \ select n}nnnCn=1n+1(2nn)Cn=1n+1(2nn)C_n = \dfrac{1}{n+1}{2n \choose n} แต่ฉันไม่เข้าใจว่าฉันจะได้ผลลัพธ์เช่นนี้ด้วยตัวเองได้อย่างไร มีวิธีการค้นหาผลลัพธ์นี้หรือไม่? ทีนี้ถ้าหากคำสั่งของต้นไม้ย่อย (ซึ่งเหลืออยู่ไหนถูกต้อง) จะไม่ถูกนำมาพิจารณา? ตัวอย่างเช่นจากมุมมองของฉันฉันคิดว่าต้นไม้สองต้นนี้เหมือนกัน: /\ /\ /\ /\ มันจะเป็นไปได้ที่จะใช้วิธีการคล้ายกับการนับจำนวนของวัตถุเหล่านี้ได้ว่าnnnโหนด?

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

1
เหตุใดอัลกอริทึมการหมุนแผนภูมิต้นไม้จึงคำนึงถึงทั้งโหนดหลักและโหนดปู่ย่าตายาย
ฉันไม่เข้าใจว่าทำไมการหมุนในโครงสร้างข้อมูลแผนภูมิต้นไม้ไม่ได้คำนึงถึงเฉพาะพาเรนต์ของโหนดการจัดอันดับ แต่ยังรวมถึงปู่ย่าตายาย (การดำเนินการ zig-zag และ zig-zig) ทำไมสิ่งต่อไปนี้ถึงไม่ทำงาน: ในขณะที่เราแทรกเช่นโหนดใหม่ไปยังทรีเราตรวจสอบว่าเราแทรกลงในทรีย่อยทางซ้ายหรือขวา หากเราแทรกเข้าไปทางซ้ายเราจะหมุน RIGHT ผลลัพธ์และในทางกลับกันสำหรับแผนผังย่อยที่เหมาะสม มันจะเป็นแบบนี้ซ้ำ ๆ ซ้ำ ๆ Tree insert(Tree root, Key k){ if(k < root.key){ root.setLeft(insert(root.getLeft(), key); return rotateRight(root); } //vice versa for right subtree } ที่ควรหลีกเลี่ยงกระบวนการ "กาง" ทั้งหมดคุณคิดหรือไม่?

1
ต้นไม้ AVL ไม่ได้มีความสมดุลของน้ำหนัก?
ในคำถามก่อนหน้านี้มีคำจำกัดความของต้นไม้สมดุลน้ำหนักและคำถามเกี่ยวกับต้นไม้สีแดงดำ คำถามนี้เป็นคำถามที่จะถามคำถามเดียวกัน แต่สำหรับต้นไม้ AVL คำถามคือให้ความหมายของ -balanced ต้นไม้ในขณะที่คำถามอื่น ๆμμ\mu มีบ้างไหมที่ต้นไม้ AVL ที่มีขนาดใหญ่ทั้งหมดนั้นมีความสมดุล ?μ>0μ>0\mu \gt 0μμ\mu ฉันคิดว่ามีเพียงคำจำกัดความเดียวของต้นไม้ AVL และไม่มีความกำกวม

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

5
การบีบอัดที่มีประสิทธิภาพของต้นไม้ที่ไม่มีชื่อ
พิจารณาต้นไม้ไบนารีแบบไม่มีป้ายกำกับ เราสามารถบีบอัดต้นไม้ดังกล่าวเมื่อมีการชี้ไปยัง subtreesและกับ (การตีความความเท่าเทียมกันของโครงสร้าง) เราเก็บ (WLOG)และแทนที่คำแนะนำทุกคนที่จะกับตัวชี้ไปยังTดูคำตอบของ uliสำหรับตัวอย่างT ′ T = T ′ = T T ′ TTTTT'T′T'T= T'T=T′T = T'===TTTT'T′T'TTT ให้อัลกอริทึมที่ใช้ต้นไม้ในความหมายข้างต้นเป็นอินพุตและคำนวณจำนวนโหนดที่เหลือหลังจากการบีบอัด อัลกอริทึมควรใช้ในเวลาที่ (ในรูปแบบค่าใช้จ่ายในเครื่องแบบ) กับจำนวนโหนดในการป้อนข้อมูลnO (nบันทึกn )O(nlog⁡n)\cal{O}(n\log n)nnn นี่เป็นคำถามสอบและฉันไม่สามารถหาวิธีแก้ปัญหาที่ดีและฉันไม่ได้เห็น

2
มีวิธีแก้ปัญหาที่เร็วกว่าสำหรับปัญหา Great Wall Jam ของ Google Code หรือไม่
ลองพิจารณาคำถามรอบรหัส 1C ของ Google Jamต่อไปนี้: กำแพงเมืองจีนเริ่มออกเป็นสายที่ไม่มีที่สิ้นสุดที่ความสูงในสถานที่ทั้งหมดเป็น0000 ชนเผ่าจำนวนหนึ่ง ,จะโจมตีกำแพงตามพารามิเตอร์ต่อไปนี้ - วันเริ่มต้น, , กำลังเริ่มต้น , พิกัดทิศตะวันตกเริ่มต้น,และพิกัดทิศตะวันออกเริ่มต้น, . นี้การโจมตีครั้งแรกเกิดขึ้นในวันในช่วงที่แข็งแรงSหากมีส่วนใดของกำแพงภายในที่มีส่วนสูงการโจมตีจะสำเร็จและในตอนท้ายของวันกำแพงจะถูกสร้างขึ้นเพื่อให้ส่วนใดส่วนหนึ่งของมันภายในของความสูงนั้นจะอยู่ที่ความสูงยังไม่มีข้อความยังไม่มีข้อความNยังไม่มีข้อความ≤ 1,000ยังไม่มีข้อความ≤1000N \le 1000DDDSSSWWWD [ W , E ] S [ W , E ] &lt; S [ W , E ] &lt; S SEEEDDD[ ว, E][W,E][W,E]SSS[W,E][W,E][W,E]&lt;S&lt;S< S[W,E][W,E][W,E]&lt;S&lt;S< SSSS (หรือมากกว่านั้นหากการโจมตีอื่น ๆ ในวันนั้นโจมตีกลุ่มเดียวกันด้วยความแข็งแกร่ง )S′&gt;SS′&gt;SS' > S …

2
สีต้นไม้ไบนารีให้เป็นต้นไม้สีแดงดำ
คำถามสัมภาษณ์ที่พบบ่อยคือการให้อัลกอริทึมเพื่อตรวจสอบว่าต้นไม้ไบนารีที่กำหนดมีความสูงสมดุล (นิยามของต้นไม้ AVL) ฉันสงสัยว่าถ้าเราสามารถทำอะไรที่คล้ายกับต้นไม้สีแดงดำ ได้รับไบนารีต้นไม้ที่ไม่มีการสุ่มสี (พร้อม NULL nodes) มีอัลกอริทึม "เร็ว" ซึ่งสามารถกำหนดได้ว่าเราสามารถทำสี (และค้นหาการระบายสี) โหนดแดง / ดำเพื่อให้พวกเขาตอบสนองคุณสมบัติทั้งหมดของต้นไม้สีแดง - ดำ (คำจำกัดความในคำถามนี้)? ความคิดเริ่มแรกคือเราสามารถเอาโหนด NULL ออกและลองตรวจสอบซ้ำ ๆ ว่าต้นไม้ที่เกิดขึ้นนั้นสามารถเป็นต้นไม้สีแดงดำได้หรือไม่ แต่ดูเหมือนจะไม่ไปไหนเลย ฉันทำเว็บ (สั้น ๆ ) เพื่อค้นหาเอกสาร แต่ดูเหมือนจะไม่พบสิ่งใดที่ดูเหมือนจะจัดการกับปัญหานี้ เป็นไปได้ว่าฉันขาดอะไรง่ายๆ

2
การพิสูจน์ฮีปไบนารีมี
ฉันพยายามที่จะพิสูจน์ว่ากองไบนารีที่มี nodes มีออกจากใบเนื่องจากกองถูกสร้างขึ้นด้วยวิธีต่อไปนี้:nnn⌈n2⌉⌈n2⌉\left\lceil \frac{n}{2} \right\rceil แต่ละโหนดใหม่จะถูกแทรกผ่านขึ้นกรอง ซึ่งหมายความว่าแต่ละโหนดใหม่จะต้องสร้างที่ลูกที่มีอยู่ถัดไป สิ่งที่ฉันหมายถึงคือเด็ก ๆ จะถูกเลื่อนระดับจากซ้ายไปขวา ตัวอย่างเช่นฮีปต่อไปนี้: 0 / \ 1 2 จะต้องมีการสร้างตามลำดับนี้: 0, 1, 2 (ตัวเลขเป็นเพียงดัชนีพวกเขาไม่ได้บ่งชี้ถึงข้อมูลจริงที่เก็บอยู่ในโหนดนั้น) สิ่งนี้มีนัยสำคัญสองประการ: ไม่มีโหนดใดในระดับไม่มีระดับที่เต็มไปอย่างสมบูรณ์k+1k+1k+1kkk เนื่องจากเด็กถูกสร้างจากซ้ายไปขวาจึงไม่มี "ช่องว่าง" ระหว่างโหนดในระดับหรือสถานการณ์ดังต่อไปนี้: k+1k+1k+1 0 / \ 1 2 / \ \ 3 4 6 (นี่จะเป็นฮีปที่ผิดกฎหมายตามคำจำกัดความของฉัน) ดังนั้นวิธีที่ดีที่จะคิดว่าฮีปนี้คือการใช้อาเรย์ของฮีปที่ไม่สามารถมี "การข้าม" ในอาเรย์ของอาร์เรย์ได้ ดังนั้นฉันคิดว่าอุปนัยอาจเป็นวิธีที่ดีในการทำสิ่งนี้ ... บางทีบางสิ่งบางอย่างที่ต้องจัดการกับแม้แต่กรณีแปลก ๆ สำหรับ n ตัวอย่างเช่นการเหนี่ยวนำโดยใช้ความจริงที่ว่าแม้กองที่สร้างขึ้นในแบบนี้จะต้องมีโหนดภายในที่มีลูกหนึ่งคนสำหรับคู่ n …

2
ฟังก์ชั่นที่กระจายอินพุต
ฉันต้องการทราบว่ามีฟังก์ชันจากหมายเลข n-bit ไปยังหมายเลข n-bit ที่มีคุณสมบัติดังต่อไปนี้หรือไม่:fff fffควรเป็น bijective ทั้งและน่าจะคำนวณได้อย่างรวดเร็วffff−1f−1f^{-1} fffควรคืนค่าตัวเลขที่ไม่มีความสัมพันธ์อย่างมีนัยสำคัญกับอินพุต เหตุผลคือ: ฉันต้องการเขียนโปรแกรมที่ทำงานกับข้อมูล ข้อมูลบางส่วนของข้อมูลจะถูกเก็บไว้ในแผนผังการค้นหาแบบไบนารี่โดยที่คีย์การค้นหาเป็นสัญลักษณ์ของตัวอักษร เมื่อเวลาผ่านไปฉันจะเพิ่มสัญลักษณ์เพิ่มเติมให้กับตัวอักษร สัญลักษณ์ใหม่จะได้รับหมายเลขฟรีต่อไป ดังนั้นต้นไม้จะมีอคติเล็ก ๆ น้อย ๆ กับคีย์ที่เล็กกว่าซึ่งทำให้เกิดการปรับสมดุลมากกว่าที่ฉันคิดว่าควรจะต้องการ ความคิดของฉันคือการฉีกตัวเลขสัญลักษณ์ที่มีเช่นที่พวกเขามีการแพร่กระจายอย่างกว้างขวางไปทั่วทั้งช่วงของ-1] เนื่องจากหมายเลขสัญลักษณ์มีความสำคัญเฉพาะในระหว่างอินพุตและเอาต์พุตที่เกิดขึ้นเพียงครั้งเดียวการใช้ฟังก์ชันดังกล่าวจึงไม่ควรแพงเกินไปfff[0,264−1][0,264−1][0,2^{64}-1] ฉันคิดเกี่ยวกับการวนซ้ำของตัวสร้างตัวเลขสุ่ม Xorshift หนึ่งครั้ง แต่ฉันไม่รู้วิธีการยกเลิกมันจริงๆแม้ว่ามันจะเป็นไปได้ในทางทฤษฎี ใครรู้ฟังก์ชั่นดังกล่าวหรือไม่? นี่เป็นความคิดที่ดีหรือไม่?

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