ใช่คุณสามารถทำการบีบอัดนี้ในเวลาแต่มันไม่ง่ายเลย :) เราทำการสังเกตก่อนแล้วจึงนำเสนออัลกอริทึม เราถือว่าทรีไม่ได้ถูกบีบอัดในตอนแรก - มันไม่จำเป็นจริงๆ แต่ทำให้การวิเคราะห์ง่ายขึ้นO(nlogn)
ประการแรกเราอธิบายลักษณะ 'โครงสร้างความเท่าเทียมกัน' ที่นำมาใช้ ให้และเป็นต้นไม้สองต้น (sub) ถ้าและเป็นทั้งต้นไม้ว่าง (ไม่มีจุดยอดเลย) พวกมันจะมีโครงสร้างเทียบเท่ากัน ถ้าและทั้งคู่ไม่ใช่ต้นไม้ว่างเปล่าพวกเขาก็มีโครงสร้างเทียบเท่าถ้าลูกซ้ายของพวกเขามีโครงสร้างเทียบเท่าและลูกขวาของพวกเขามีโครงสร้างเทียบเท่ากัน 'ความเท่าเทียมกันของโครงสร้าง' เป็นจุดคงที่ที่น้อยที่สุดเหนือคำจำกัดความเหล่านี้T ′ T T ′ T T ′TT′TT′TT′
ตัวอย่างเช่นโหนดใบไม้สองโหนดใด ๆ มีโครงสร้างเทียบเท่ากันเนื่องจากมีโหนดต้นไม้เป็นลูกทั้งสองซึ่งมีโครงสร้างเทียบเท่ากัน
เนื่องจากค่อนข้างน่ารำคาญที่จะพูดว่า 'ลูกซ้ายของพวกเขามีโครงสร้างที่เท่าเทียมกันและเป็นลูกที่ถูกต้อง' เรามักจะพูดว่า 'ลูกของพวกเขามีโครงสร้างเทียบเท่า' และตั้งใจเหมือนกัน นอกจากนี้โปรดทราบว่าบางครั้งเราอาจพูดว่า 'จุดสุดยอดนี้' เมื่อเราหมายถึง 'ทรีย่อยที่อยู่ที่จุดยอดนี้'
คำจำกัดความข้างต้นให้คำแนะนำวิธีการบีบอัดข้อมูลทันที: หากเราทราบความเท่าเทียมกันเชิงโครงสร้างของ subtrees ทั้งหมดที่มีความลึกไม่เกินดังนั้นเราสามารถคำนวณความสมดุลเชิงโครงสร้างของ subtrees ที่มีความลึกได้อย่างง่ายดาย เราไม่ต้องทำการคำนวณนี้ในทางที่สมาร์ทเพื่อหลีกเลี่ยงการเวลาในการทำงานd + 1 O ( n 2 )dd+1O(n2)
อัลกอริทึมจะกำหนดตัวระบุให้ทุกจุดสุดยอดในระหว่างการดำเนินการ ตัวระบุเป็นตัวเลขที่อยู่ในชุด\} ตัวระบุมีความเป็นเอกลักษณ์และไม่เคยเปลี่ยนแปลง: ดังนั้นเราถือว่าเราตั้งค่าตัวแปร (ทั่วโลก) เป็น 1 เมื่อเริ่มต้นอัลกอริทึมและทุกครั้งที่เรากำหนดตัวระบุให้กับจุดสุดยอดเรากำหนดค่าปัจจุบันของตัวแปรนั้นให้กับจุดสุดยอด ค่าของตัวแปรนั้น{1,2,3,…,n}
อันดับแรกเราจะแปลงทรีอินพุทเป็นรายการ (ไม่เกิน ) ที่มีจุดยอดที่มีความลึกเท่ากันพร้อมกับตัวชี้ไปยังพาเรนต์ นี้จะกระทำได้อย่างง่ายดายในเวลาO ( n )nO(n)
ก่อนอื่นเราอัดใบทั้งหมด (เราสามารถหาใบเหล่านี้ในรายการที่มีจุดยอด 0 ความลึก) ลงในจุดยอดเดียว เรากำหนดตัวระบุจุดสุดยอดนี้ การบีบอัดของสองจุดยอดจะกระทำโดยการเปลี่ยนเส้นทางพาเรนต์ของจุดยอดทั้งสองไปที่จุดยอดอื่นแทน
เราจะให้ข้อสังเกตสอง: แรกยอดใด ๆ ที่มีลูกของความลึกขนาดเล็กอย่างเคร่งครัดและประการที่สองถ้าเราได้ดำเนินการบีบอัดในทุกจุดของความลึกขนาดเล็กกว่า (และได้ให้ตัวระบุพวกเขา) แล้วสองจุดของความลึกมีโครงสร้างเทียบเท่า สามารถบีบอัดถ้าตัวระบุของลูกของพวกเขาตรง การสังเกตครั้งสุดท้ายนี้เกิดขึ้นจากการโต้แย้งดังต่อไปนี้: จุดยอดสองจุดนั้นเทียบเท่ากันเชิงโครงสร้างถ้าลูก ๆ ของพวกเขามีโครงสร้างเท่ากันและหลังจากการบีบอัดนี่หมายความว่าตัวชี้ของพวกเขาชี้ไปที่เด็กคนเดียวกันซึ่งหมายความว่าddd
เราวนซ้ำรายการทั้งหมดด้วยโหนดที่มีความลึกเท่ากันจากความลึกเล็กไปจนถึงความลึกขนาดใหญ่ สำหรับทุกระดับเราสร้างรายการของคู่จำนวนเต็มโดยที่ทุกคู่สอดคล้องกับตัวระบุของชายด์ของจุดยอดบางอย่างในระดับนั้น เรามีจุดยอดสองจุดในระดับนั้นเท่ากันเชิงโครงสร้างถ้าคู่เลขจำนวนเต็มที่ตรงกันของพวกเขาเท่ากัน การใช้การเรียงลำดับพจนานุกรมเราสามารถจัดเรียงสิ่งเหล่านี้และรับชุดของจำนวนเต็มคู่ที่เท่ากัน เราบีบอัดชุดเหล่านี้เป็นจุดยอดเดียวตามด้านบนและให้ตัวระบุ
ข้อสังเกตข้างต้นพิสูจน์ให้เห็นว่าวิธีนี้ใช้งานได้และส่งผลให้ต้นไม้ที่ถูกบีบอัด เวลาทำงานทั้งหมดคือบวกเวลาที่ต้องใช้ในการจัดเรียงรายการที่เราสร้าง เนื่องจากจำนวนทั้งหมดของจำนวนเต็มคู่ที่เราสร้างคือnสิ่งนี้ทำให้เราทราบว่าเวลาการทำงานทั้งหมดคือO ( n log n )ตามที่ต้องการ การนับจำนวนโหนดที่เราเหลือในตอนท้ายของโพรซีเดอร์นั้นเล็กน้อย (เพียงแค่ดูจำนวนตัวบ่งชี้ที่เราแจกให้)O(n)nO(nlogn)