การค้นหาองค์ประกอบที่เล็กที่สุดของ k'th จากลำดับที่กำหนดไว้เฉพาะกับหน่วยความจำ O (k) เวลา O (n)


11

สมมติว่าเราอ่านลำดับของตัวเลขnทีละตัว วิธีค้นหาองค์ประกอบที่เล็กที่สุดของkเพียงแค่ใช้หน่วยความจำเซลล์O(k)และในเวลาเชิงเส้น ( O(n) ) ผมคิดว่าเราควรบันทึกแรกkแง่ของลำดับและเมื่อได้รับk+1 'ระยะ TH ลบคำซึ่งเราแน่ใจว่ามันไม่สามารถที่k ' องค์ประกอบที่เล็ก TH แล้วบันทึกk+1 'ระยะ TH ดังนั้นเราควรมีตัวบ่งชี้ที่แสดงคำที่ใช้ไม่ได้ในแต่ละขั้นตอนและตัวบ่งชี้นี้ควรได้รับการอัปเดตในแต่ละขั้นตอนอย่างรวดเร็ว ฉันเริ่มต้นด้วย"สูงสุด"; แต่มันไม่สามารถอัพเดทได้อย่างรวดเร็ว หมายความว่าหากเราพิจารณาค่าสูงสุดแล้วในการลบครั้งแรกเราพลาดค่าสูงสุดและเราควรค้นหาค่าสูงสุดในO(k)และสาเหตุ(nk)×O(k)เวลาที่ไม่เป็นเชิงเส้น บางทีเราควรบันทึกลำดับของkลำดับแรกอย่างชาญฉลาดยิ่งขึ้น

ฉันจะแก้ปัญหานี้ได้อย่างไร


1
คุณสนใจอัลกอริทึมออนไลน์หรืออัลกอริทึมใด ๆ จะทำอย่างไร
Yuval Filmus

หากk=θ(n)คุณสามารถทำได้โดยใช้อัลกอริทึมสถิติการสั่งซื้อ ถ้าk=o(n)คุณสามารถทำมันได้หน่วยความจำO(k)และเวลาO(nlogk)โดยใช้ต้นไม้ที่มีความสมดุลสูง
Shreesh

มันเรียกว่าปัญหาการเลือกen.wikipedia.org/wiki/Selection_algorithm
xavierm02

มีขั้นตอนวิธีการเชิงเส้นในสถานที่ซึ่งคุณสามารถ google แต่พวกเขาค่อนข้างซับซ้อน
Yuval Filmus

@ xavierm02 ไม่ใช่ปัญหาการเลือกเหมือนกัน เนื่องจากมีข้อ จำกัด ของหน่วยความจำ
Shahab_HK

คำตอบ:


16

สร้างบัฟเฟอร์ขนาด k อ่านในองค์ประกอบ2 kจากอาร์เรย์ ใช้ ขั้นตอนวิธีการเลือกเส้นเวลาพาร์ทิชันบัฟเฟอร์เพื่อให้kองค์ประกอบที่เล็กที่สุดเป็นครั้งแรก นี้จะใช้เวลาO ( k )เวลา ตอนนี้อ่านในอีกkรายการจากอาร์เรย์ของคุณลงในบัฟเฟอร์เปลี่ยนkรายการใหญ่ที่สุดในบัฟเฟอร์พาร์ทิชันบัฟเฟอร์เป็นมาก่อนและทำซ้ำ2k2kkO(k)kk

นี้จะใช้เวลาเวลาและO ( k )พื้นที่O(kn/k)=O(n)O(k)


+1 นี่เหมาะกับ asymptotics ที่ถูกถาม ที่ถูกกล่าวว่าฉันไม่เชื่อว่ามันเร็วกว่าการทำอัลกอริทึมการเลือกเวลาเชิงเส้นเดียว ... ยกเว้นเมื่อเป็นค่าคงที่ขนาดเล็กแล้วมันให้มุมมองที่น่าสนใจ ตัวอย่างเช่นสำหรับk = 1อัลกอริทึมนี้สร้างฟังก์ชั่น kk=1min
orlp

1
บางครั้งอัลกอริทึมการเลือกเวลาเชิงเส้นใช้พื้นที่มากเกินไป ตัวอย่างเช่นไม่เหมาะสำหรับใช้ในบริบทการสตรีมหรือเมื่ออาร์เรย์อินพุตไม่เปลี่ยนรูป
jbapple

นั่นคือคะแนนที่ถูกต้อง
orlp

3

O(k)O(nlogk)kO(k)O(logk)O(k+nlogk)O(nlogk)

O(logn)O(n)kk

O(logn)O(k)O(logn)264log264=64kn


O(n×logmin(k,nk))

@ xavierm02 =(k) พิสูจน์: กรณีที่เลวร้ายที่สุดสำหรับเป็นnกรณีที่เลวร้ายที่สุดสำหรับเป็น2 พวกเขาเป็นคนเดียวที่อยู่ในปัจจัยคงจึง =(k) O(min(k,nk))O(k)knmin(k,nk)n2O(min(k,nk))O(k)
orlp

@ xavierm02 ที่ถูกกล่าวว่าก็ยังคงเป็น speedup ดี :)
orlp

un,k=kคือแต่ก็ไม่ได้NK)) สมมติว่ามันเป็น จากนั้นมีและบางส่วนเพื่อให้ทุกเรามีซึ่งเป็นเท็จอย่างชัดเจน (เพราะเราสามารถใช้ ดังนั้น(k) O(k)O(min(k,nk))CMMknkC(nk)n=k+).O(min(k,nk))O(k)
xavierm02

@ xavierm02 ฉันไม่คุ้นเคยกับคุณ เพื่อความเป็นธรรมผมโดยทั่วไปค่อนข้างคุ้นเคยกับหลายมิติ big-สัญกรณ์โดยเฉพาะอย่างยิ่งการพิจารณาว่ามิติไม่ได้ที่ไม่เกี่ยวข้องกัน O n , kun,kOn,k
orlp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.