หาองค์ประกอบ k ที่เล็กที่สุดในอาร์เรย์ใน O (k)


12

นี่เป็นคำถามที่น่าสนใจที่ฉันพบในเว็บ รับอาร์เรย์ที่มีตัวเลข n (โดยไม่มีข้อมูลเกี่ยวกับพวกเขา) เราควรประมวลผลอาร์เรย์ในเวลาเชิงเส้นเพื่อให้เราสามารถคืนองค์ประกอบที่เล็กที่สุดในเวลา O (k) เมื่อเราได้รับหมายเลข 1 <= k <= n

ฉันได้พูดคุยปัญหานี้กับเพื่อนบางคน แต่ไม่มีใครสามารถหาทางออกได้ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม!

บันทึกย่อแบบด่วน: - ลำดับขององค์ประกอบที่เล็กที่สุดของ k นั้นไม่สำคัญ - องค์ประกอบในอาร์เรย์คือจำนวนอาจเป็นจำนวนเต็มและอาจจะไม่ใช่ การประมวลผลล่วงหน้าคือเวลา O (n) ฟังก์ชั่น (ค้นหาองค์ประกอบที่เล็กที่สุด k) ในเวลา O (k)


4
วิธีการเกี่ยวกับการใช้กองต่ำสุด?
Shir

1
ดูการคำนวณ k-skyband และ top-k กระดาษcs.sfu.ca/~jpei/publications/subsky_tkde07.pdfมีการทบทวนที่ดีเกี่ยวกับวรรณกรรมที่เกี่ยวข้อง
András Salamon

1
Shir-I ได้ตรวจสอบแนวคิด min-heap แล้ว อย่างไรก็ตามเพื่อที่จะพิมพ์ตัวเลขที่เล็กที่สุดในหน่วยเป็นนาทีเป็นเวลา O (klogn) และไม่ได้ O (k) ตามที่ต้องการ
1511 Idan

4
@idannik: ทำไมคุณคิดว่ามันจะใช้เวลาเวลาเพื่อหาสิ่งที่องค์ประกอบที่เล็กที่สุดในนาทีกอง? kΩ(klogn)k
Kristoffer Arnsfelt Hansen

8
ฉันไม่คิดว่านี่เป็นระดับการวิจัย ดูเหมือนว่าได้รับมอบหมาย คุณพบมันที่ไหน?
Kaveh

คำตอบ:


24

ประมวลผลอาร์เรย์ของค่าล่วงหน้าในเวลา :O ( n )nO(n)

  • in
  • ในขณะที่i>2
    • คำนวณค่ามัธยฐานของในเวลาA [ 1 .. i ] O ( i )mA[1..i]O(i)
    • พาร์ติชันเป็นและในเวลาเดียวกันA [ 1 .. i / 2 - 1 ] m A [ i / 2 + 1 .. i ] mA[1..i]A[1..i/21]mA[i/2+1..i]m
    • ii/2

เวลาประมวลผลล่วงหน้าทั้งหมดอยู่ภายในO(1+2+4+...+n)O(n)

ตอบแบบสอบถามสำหรับที่องค์ประกอบที่เล็กที่สุดในในเวลา :A O ( k )kAO(k)

  • llog2k
  • เลือกองค์ประกอบองค์ประกอบของในเวลาx(k2l)xO ( 2 l ) O ( k )A[2l..2l+1]O(2l)O(k)
  • พาร์ทิชันโดยในเวลาเดียวกันA[2l..2l+1]x

A[1..k]มีองค์ประกอบที่เล็กที่สุดk

อ้างอิง:

  • ในปี 1999 โดเรซวิคและให้อัลกอริทึมในการคำนวณค่ามัธยฐานขององค์ประกอบในเวลาภายในการเปรียบเทียบที่ทำให้ขั้นตอนวิธีการเลือกองค์ประกอบ TH จากองค์ประกอบเรียงลำดับในเวลาน้อยกว่าเปรียบเทียบ2.942 n + o ( n ) k n 6 nn2.942n+o(n)kn6n

1
ฉันเดาว่าลูปภายนอกนั้นควรจะเป็น 'for i ใน ' อัลกอริทึมของคุณแตกต่างจากคำตอบใน Yuval Filmus หรือไม่? {2lgn,,4,2,1}
Radu GRIGore

2
นี่คือลักษณะทั่วไปของอัลกอริทึมของฉันไปโดยพลnนอกจากนี้ยังอธิบายรายละเอียดการปฏิบัติบางอย่างซึ่งจงใจออกจากคำตอบของฉัน n
Yuval Filmus

3
@YuvalFilmus คุณต้องการแสดงความคิดเห็นของคุณหรือไม่ว่าคำตอบของฉันใกล้เคียงกับคุณอย่างผิดจรรยาบรรณหรือไม่? นี่เป็นวิธีแก้ปัญหาที่นึกถึงเมื่อฉันอ่านคำถาม ฉันเห็นว่าคุณโพสต์ข้อความที่คล้ายกัน แต่พบว่าไม่ชัดเจนดังนั้นฉันจึงเขียนของตัวเอง (ซึ่งตรงข้ามกับการแก้ไขที่สำคัญของคุณ) สิ่งที่สำคัญที่สุดคือคุณภาพของคำตอบในระบบไม่ใช่ผู้เขียนพวกเขาจริง ๆ : ตราและชื่อเสียงเป็นเพียงสิ่งจูงใจไม่ใช่วัตถุประสงค์ในตัวเอง
Jeremy

4
@ Jeremy ไม่เลย; เพียงว่าโซลูชั่นทั้งสองนั้นเหมือนกัน (แต่งานของคุณทำงานโดยพลการ ) และฉันไม่ได้ระบุรายละเอียดในกรณีที่เป็นคำถามทำการบ้าน n
Yuval Filmus

2
โอ้ :( ขออภัยเกี่ยวกับเรื่องนั้น (แม้ว่าฉันจะยังคงคิดว่าให้คำตอบที่สมบูรณ์จะมีความสำคัญมากกว่าความสงสัยที่ได้รับมอบหมาย)
เจเรมี

14

สมมติว่าสำหรับความเรียบง่ายที่เมตร ใช้อัลกอริทึมการเลือกเวลาเชิงเส้นเพื่อค้นหาองค์ประกอบที่ตำแหน่ง ; ใช้เวลาเชิงเส้น ได้รับหาดังกล่าวที่ ; ทราบว่า2k กรองออกทุกองค์ประกอบของการจัดอันดับที่มากที่สุดและตอนนี้ใช้ขั้นตอนวิธีการเลือกเส้นเวลาเพื่อหาองค์ประกอบที่ตำแหน่งในเวลา(k)n=2m2m1,2m2,2m3,,1kt2t1k2t2t2k2tkO(2t)=O(k)

การชี้แจง:อาจดูเหมือนว่าการประมวลผลล่วงหน้าใช้เวลาและนั่นเป็นกรณีจริง ๆ หากคุณไม่ระวัง นี่คือวิธีทำการประมวลผลล่วงหน้าในเวลาเชิงเส้น:Θ(nlogn)

while n > 0:
  find the (lower) median m of A[0..n-1]
  partition A in-place so that A[n/2-1] = m
  n = n/2

การแบ่งพาร์ติชันแบบ in-place ทำได้เหมือนกับใน quicksort เวลาทำงานเป็นเชิงเส้นในและเป็นเส้นตรง ในท้ายที่สุดอาร์เรย์เป็นไปตามคุณสมบัติต่อไปนี้: สำหรับแต่ละ ,ประกอบด้วยองค์ประกอบที่เล็กที่สุดของn+n/2+n/4++1<2nAkA[0..n/2k1]n/2k


1
เป็นธรรมชาติ หากมีการเรียงลำดับอาร์เรย์ที่คุณสามารถแก้ปัญหานี้ในโดยไม่ต้องดำเนินการล่วงหน้า บางทีคุณอาจไม่ได้ตระหนักถึงอัลกอริทึมการเลือกเวลาเชิงเส้นที่สามารถหาองค์ประกอบที่ใหญ่ที่สุดในเวลา ? O(1)kO(n)
Yuval Filmus

4
@Yuval Filmus: คุณไม่ได้ใช้อัลกอริทึมครั้งรวมเป็นขั้นตอนหรือไม่ หรือคุณมีความคิดสอดแทรกบางอย่าง? lognnlogn
András Salamon

3
@ AndrásSalamon: ถ้าคุณอ่านคำตอบที่ได้รับจากเจเรมี (ซึ่งดูเหมือนกับฉันเกือบจะเหมือนกับที่คุณเห็น) คุณจะเห็นว่าคุณประมวลผลอาร์เรย์ทั้งหมดเป็นครั้งแรกในครึ่งแรกและต่อไป
Radu GRIGore

3
@ AndrásSalamon Radu ถูกต้อง หลังจากที่คุณพบค่ามัธยฐานคุณแบ่งอาร์เรย์ (ในสถานที่) ลงในครึ่งล่างและบนของมัน เวลาทำงานแล้วสัดส่วนกับ<2n n+n/2+n/4++1<2n
Yuval Filmus

5
อนึ่งอัลกอริทึมนี้ปรากฏเป็นรูทีนย่อยในคำตอบของฉันสำหรับคำถามก่อนหน้านี้: cstheory.stackexchange.com/questions/17378/ …
David Eppstein

2

ขั้นแรกใช้เพื่อสร้าง min-heap เป็นที่ทราบกันว่าเราสามารถใช้เพื่อหาสิ่งที่องค์ประกอบที่เล็กที่สุดในนาทีกอง:O(n)O(k)k

Frederickson, Greg N. , อัลกอริทึมที่ดีที่สุดสำหรับการเลือกใน min-heap , Inf คอมพิวเต 104, ฉบับที่ 2, 197-214 (1993) ZBL0818.68065 ..


1
ฉันไม่เห็นวิธีที่เราสามารถแยกองค์ประกอบเล็กที่สุดจาก min-heap ในเวลาเนื่องจากการลบแต่ละองค์ประกอบต้องใช้เวลาลอการิทึมในขนาดของ heap คุณช่วยอธิบายสิ่งที่คุณมีในใจที่นี่ได้ไหม? ขอบคุณ! O ( k )kO(k)
a3nm

@ a3nm มันไม่ใช่อัลกอริธึมง่ายๆ แต่ฉันได้อัปเดตข้อมูลอ้างอิงแล้ว
hqztrue

ขออภัยเท่าที่ผมสามารถบอกได้อ้างอิงที่คุณเพิ่มเพียงการพูดคุยเกี่ยวกับการเลือก -th องค์ประกอบที่เล็ก (เช่นองค์ประกอบเดียวไม่ได้เป็นส่วนประกอบเล็ก ๆ ) ในเวลา(k) ฉันไม่เห็นว่าวิธีนี้จะปรับให้เข้ากับการสกัดองค์ประกอบที่เล็กที่สุด คุณสามารถอธิบายหรืออัปเดตข้อมูลอ้างอิงได้ไหม kkkkO(k)k
a3nm

@ a3nm ใช่การอ้างอิงจะให้องค์ประกอบที่เล็กที่สุดใน -thเท่านั้น อย่างไรก็ตามหลังจากที่รู้ว่าคุณก็สามารถดำเนินการ DFS ในกองเพื่อหาองค์ประกอบทั้งหมดใน(k) xkxO ( k )<xO(k)
hqztrue

ขออภัยฉันไม่เห็น DFS ใดที่คุณจะทำการค้นหาองค์ประกอบเหล่านี้ (บางคนอาจไม่ได้เป็นบรรพบุรุษขององค์ประกอบที่เล็กที่สุดของ -th ในกองกล่าวคือเท่าที่ฉันสามารถบอกตำแหน่งได้เช่นองค์ประกอบ -th รู้ว่าตำแหน่งขององค์ประกอบ -th นั้นไม่สำคัญ .)k / 2 kkk/2k
a3nm

0

ใช้การเลือกเวลาเชิงเส้นเพื่อค้นหาองค์ประกอบที่ใหญ่ที่สุดจากนั้นทำขั้นตอนพาร์ติชันจาก quicksort โดยใช้องค์ประกอบที่ใหญ่ที่สุดเป็นเดือยkkk


1
คำถามเดิมกล่าวว่าไม่เป็นที่รู้จักใน preprocessing เวลา ....k
เจเรมี

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