โซลูชันของคุณถูกต้องและเป็นไปตามคำจำกัดความของd -ary heap แต่เมื่อคุณชี้ให้เห็นสัญกรณ์ของคุณค่อนข้างซับซ้อน
คุณอาจใช้ทั้งสองฟังก์ชันต่อไปนี้เพื่อดึงพาเรนต์ขององค์ประกอบi -th และj -th ย่อยขององค์ประกอบi -th
d-ary-parent(i) return ⌊(i−2)/d+1⌋
d-ary-child(i,j) return d(i−1)+j+1
เห็นได้ชัดว่าd คุณสามารถตรวจสอบฟังก์ชั่นเหล่านั้นได้โดยตรวจสอบว่า1≤j≤dd-ary-parent(d-ary-child(i,j))=i
นอกจากนี้ยังมองเห็นได้ง่ายคือ heap แบบไบนารีเป็นแบบพิเศษของ -ary heap โดยที่หากคุณแทนที่ด้วยคุณจะเห็นว่าฟังก์ชันตรงกับฟังก์ชันผู้ปกครอง, ซ้ายและขวาที่ระบุไว้ในหนังสือdd=2d2
ถ้าผมเข้าใจคำตอบของคุณอย่างถูกต้องคุณใช้ความก้าวหน้าทางเรขาคณิต ในกรณีของคุณคุณจะได้ไปซึ่งเห็นได้ชัดซึ่งอันที่จริงแล้วเป็นโซลูชันที่ถูกต้องและถูกต้อง แต่เพียงเพื่อประโยชน์ของการจัดการความผันผวนอย่างต่อเนื่องคุณอาจต้องการที่จะเขียน(n))h=logd(nd−1+1)−1logd(nd)−1=logd(n)+logd(d)−1=logd(n)+1−1=logd(n)Θ(logd(n))
เหตุผลนี้คือฮีปบางตัวอาจไม่สมดุลดังนั้นพา ธ ที่ยาวที่สุดและพา ธ ที่สั้นที่สุดของพวกเขาจะแปรผันตามค่าคงที่โดยใช้สัญลักษณ์คุณจะกำจัดปัญหานี้cΘ
คุณไม่จำเป็นต้องดำเนินการตามขั้นตอนที่กำหนดในตำราเรียนอีกครั้ง แต่คุณต้องแก้ไขเล็กน้อยเช่นกำหนดให้เด็กทุกคนในตารางโดยใช้และฟังก์ชั่น.AUXd-ary-parentd-ary-child
เพราะไม่ได้เปลี่ยนแปลงก็ขึ้นอยู่กับเวลาการทำงานของ{MAX-HEAPIFY} ในการวิเคราะห์ของคุณตอนนี้คุณต้องใช้เวลากรณีเลวร้ายที่สุดตามสัดส่วนสูงและจำนวนลูกที่แต่ละโหนดจะต้องตรวจสอบ (ซึ่งมากที่สุดง ) การวิเคราะห์ของคุณแม่นยำอีกครั้งในตอนท้ายคุณจะได้ซึ่งสามารถเปลี่ยนเป็น:EXTRACT-MAXMAX-HEAPIFYO(d logd(n(d−1)))
O(d logd(n(d−1)))=O(d(logd(n)+log(d−1)))=O(d logd(n)+d logd(d−1))
สำหรับเหตุผลในทางปฏิบัติเรามักจะสามารถสรุปได้ว่าเพื่อให้เราสามารถสูญเสียเป็นส่วนหนึ่งของOโน้ตแล้วเราจะได้รับ(n)) ซึ่งเป็นโซลูชันที่ถูกต้อง แต่ไม่น่าแปลกใจที่คุณยังสามารถวิเคราะห์เวลาทำงานฟังก์ชั่นการใช้ทฤษฎีบทโทซึ่งจะแสดงให้เห็นว่าไม่ได้เป็นเพียงแต่แม้\d≪ndlogd(d−1)O(dlogd(n))MAX-HEAPIFYOΘ
หนังสือ CLRS มีขั้นตอน INSERT แล้ว ซึ่งมีลักษณะเช่นนี้:
INSERT(A,key) A.heap_size=A.heap_size+1 A[A.heap_size]=−∞ INCREASE-KEY(A,A.heap_size,key)
มันสามารถพิสูจน์ได้ง่าย แต่สามัญสำนึกสั่งที่ซับซ้อนที่เวลามันคือ(n)) อาจเป็นเพราะกองอาจเข้าไปในรูตทั้งหมดO(logd(n))
เช่นเดียวกับ INSERT INCREASE-KEY ก็ถูกกำหนดไว้ในตำราเรียนด้วยเช่นกัน:
INCREASE-KEY(A,i,key) if key<A[i] error"new key is smaller then current" A[i]=key while i>1 and A[i]>A[d-ary-parent(i)] A[i]↔A[d-ary-parent(i)] i=d-ary-parent(i)
ความซับซ้อนคือ (ดูจุดก่อนหน้า)O(logd(n))
h = (log [nd−1+1])− 1
ดังนั้นเหนือคำอธิบายสำหรับความสูงจะไม่ถือเป็นจริง h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] ถึงอย่างไรก็ตามความสูงของต้นไม้จะถูกเขียนเป็นΘ(log(n)).
หมายเหตุ: บันทึกจะเป็นฐาน d เสมอสำหรับ d-ary heap .