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


11

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

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


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

หากk=θ(n)คุณสามารถทำได้โดยใช้อัลกอริทึมสถิติการสั่งซื้อ ถ้าk=o(n)คุณสามารถทำมันได้หน่วยความจำO(k)และเวลาO(nlog⁡k)โดยใช้ต้นไม้ที่มีความสมดุลสูง
— 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(k∗n/k)=O(n)O(k)


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

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

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

3

O(k)O(nlog⁡k)kO(k)O(log⁡k)O(k+nlog⁡k)O(nlog⁡k)

O(log⁡n)O(n)kk

O(log⁡n)O(k)O(log⁡n)264log⁡264=64kn


O(n×log⁡min(k,n−k))

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

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

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

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