ประมวลผลอาร์เรย์ล่วงหน้าเพื่อนับองค์ประกอบในชิ้น (ลดเหลือ RMQ?)


11

รับอาร์เรย์1 , ... , nจำนวนธรรมชาติkที่kเป็นค่าคงที่ฉันต้องการคำตอบในO ( 1 )คำสั่งของรูปแบบ: "กี่ครั้งไม่เมตรปรากฏในอาร์เรย์ระหว่างดัชนีฉันและเจ "a1,,ankkO(1)mij

อาร์เรย์ควรถูกประมวลผลล่วงหน้าในเวลาเชิงเส้น โดยเฉพาะอย่างยิ่งฉันต้องการทราบว่ามีการลดลงของการค้นหาขั้นต่ำของช่วงหรือไม่


นี่เทียบเท่ากับ RMQ ในกรณีที่และคุณต้องการสอบถามจำนวนคนภายในช่วงเวลา ดังนั้นเราจึงสามารถใช้มัน ฉันไม่สามารถตอบคำถามของตัวเองได้เนื่องจากข้อ จำกัด ของ SEk=1


คุณสามารถลดความแตกต่างขององค์ประกอบให้กับปัญหาของคุณ (ในเวลาเชิงเส้น) บางทีการพูดคุยเกี่ยวกับแบบจำลองนั้นอยู่ในลำดับ?
Aryabhata

@Aryabhata ปัญหาความแตกต่างขององค์ประกอบคืออะไร ตอนนี้ฉันกำลังอ่านสิ่งนี้: en.wikipedia.org/wiki/Range_Queries
andy

นี่ง่ายกว่า RMQ มาก คำแนะนำ: เนื่องจาก k เป็นค่าคงที่การประมวลผลล่วงหน้าสามารถใช้เวลาเป็นสัดส่วนกับ kn และยังคงนับเป็นเวลาเชิงเส้น
Tsuyoshi Ito

@Aryabhata: การลดลงที่ฉันคิดว่าคุณกำลังพูดถึงไม่ทำงานเพราะ k เป็นปัญหาคงที่
Tsuyoshi Ito

ในกรณีที่ถ้าอาร์เรย์ถูกกำหนดไว้ที่จุดเริ่มต้นและไม่ได้รับการปรับปรุงในภายหลัง RMQ เป็น overkill อย่างที่ฉันแนะนำในความคิดเห็นก่อนหน้าของฉัน
Tsuyoshi Ito

คำตอบ:


4

k0..m0m<n0..nO(nk)=O(n)count[pos][elem] = occurences of 'elem' in the indices 0..posO(nk)i,j

กระบวนการเตรียมการผลิต

initialise count[pos][elem] to 0 for all elem, pos
for pos=0 to n
  for num=0 to k
      count[pos][num] = (0 if pos==0 else count[pos-1][num])
  count[pos][arr[pos]] ++

สอบถาม

(สมมติว่า i, j เป็นทั้งขอบเขตรวม)

if i == 0
  return count[j][m]
else
  return count[j][m] - count[i-1][m]

kcountO(logn)O(logn)

ขอโทษสำหรับปัญหาใด ๆ กับคำตอบนี้มันเป็นครั้งแรกของฉัน

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