1
การนับคู่ผกผัน
แอปพลิเคชั่นการแบ่งและพิชิตแบบคลาสสิกคือการแก้ปัญหาต่อไปนี้: รับอาร์เรย์ของที่แตกต่างกัน, องค์ประกอบเทียบเคียงนับจำนวนของคู่ผกผันในอาร์เรย์: คู่เช่นว่าและเจa[1…n]a[1…n]a[1\dots n](i,j)(i,j)(i,j)a[i]>a[j]a[i]>a[j]a[i] \gt a[j]i<ji<ji \lt j วิธีการหนึ่งในการทำเช่นนี้คือผสาน Merge Sort แต่ยังนับจำนวนคู่ผกผันในปัญหาย่อยด้วย ในระหว่างขั้นตอนการผสานเราจะนับจำนวนคู่ผกผันที่ครอบคลุมปัญหาย่อย (สอง) และเพิ่มเข้าไปในการนับของปัญหาย่อย ขณะนี้เป็นสิ่งที่ดีและให้อัลกอริทึมเวลาสิ่งนี้ทำให้เกิดความสับสนO(nlogn)O(nlogn)O(n\log n) หากเรามีข้อ จำกัด เพิ่มเติมที่อาเรย์เป็นแบบอ่านอย่างเดียวเราสามารถทำสำเนาและจัดการกับการคัดลอกหรือใช้โครงสร้างข้อมูลเพิ่มเติมเช่นสถิติการสั่งซื้อแบบต้นไม้ไบนารีที่สมดุลเพื่อทำการนับซึ่งทั้งสองอย่างใช้พื้นที่Θ(n)Θ(n)\Theta(n) คำถามปัจจุบันคือพยายามพื้นที่ให้ดีขึ้นโดยไม่กระทบต่อเวลาใช้งาน กล่าวคือ มีอัลกอริธึมเวลาเพื่อนับจำนวนคู่ผกผันซึ่งทำงานบนอาเรย์แบบอ่านอย่างเดียวและใช้พื้นที่ย่อยเชิงเส้น (เช่น ) หรือไม่O(nlogn)O(nlogn)O(n\log n)o(n)o(n)o(n) สมมติรูปแบบ RAM ค่าใช้จ่ายสม่ำเสมอและองค์ประกอบที่ใช้เวลาพื้นที่และการเปรียบเทียบระหว่างพวกเขาคือ(1)O(1)O(1)O(1)O(1)O(1)O(1) การอ้างอิงจะทำ แต่คำอธิบายจะดีกว่า :-) ฉันพยายามค้นหาเว็บ แต่ไม่พบคำตอบที่เป็นบวก / ลบสำหรับสิ่งนี้ ฉันคิดว่านี่เป็นเพียงความอยากรู้อยากเห็น