คุณสามารถนับจำนวนผู้รุกรานในรายการ
การผกผัน
ผกผันในลำดับขององค์ประกอบของประเภทT
คือคู่ขององค์ประกอบลำดับที่ปรากฏออกคำสั่งตามที่สั่งซื้อบางส่วน<
ในชุดของT
's
จากWikipedia :
เป็นทางการให้A(1), A(2), ..., A(n)
เป็นลำดับของn
ตัวเลข
ถ้าi < j
และA(i) > A(j)
แล้วทั้งคู่(i,j)
จะเรียกว่าการผกผันA
ของ
จำนวนผกผันของลำดับเป็นหนึ่งในวัดที่พบบ่อยของ sortedness ของมัน
อย่างเป็นทางการหมายเลขผกผันถูกกำหนดให้เป็นจำนวนการผกผันคือ
9, 5, 7, 6
เพื่อให้คำนิยามเหล่านี้ชัดเจนพิจารณาลำดับตัวอย่าง ลำดับนี้มีinversions (0,1), (0,2), (0,3), (2,3)
และจำนวนผกผัน 4
หากคุณต้องการค่าระหว่าง0
และคุณสามารถแบ่งจำนวนผกผันโดย1
N choose 2
ในการสร้างอัลกอริทึมเพื่อคำนวณคะแนนนี้สำหรับการเรียงลำดับรายการคุณมีสองวิธี
วิธีที่ 1 (กำหนด)
ปรับเปลี่ยนอัลกอริทึมการเรียงลำดับที่คุณชื่นชอบเพื่อติดตามจำนวนผู้รุกรานที่แก้ไขเมื่อมันทำงาน แม้ว่านี่จะเป็นเรื่องไม่สำคัญและมีการใช้งานที่แตกต่างกันไปตามอัลกอริทึมการเรียงลำดับที่คุณเลือก แต่คุณจะพบกับอัลกอริทึมที่ไม่แพงมาก (ในแง่ของความซับซ้อน) กว่าอัลกอริทึมการเรียงลำดับที่คุณเริ่มต้น
หากคุณใช้เส้นทางนี้โปรดระวังว่ามันไม่ง่ายเท่ากับการนับ "สลับ" ตัวอย่างเช่นการรวมกันเป็นกรณีที่เลวร้ายที่สุดO(N log N)
แต่ถ้ามันถูกเรียกใช้ในรายการเรียงตามลำดับจากมากไปน้อยมันจะแก้ไขN choose 2
การรุกรานทั้งหมด นั่นคือO(N^2)
การแก้ไขในO(N log N)
การปฏิบัติการผกผัน ดังนั้นการดำเนินการบางอย่างจะต้องแก้ไขการผกผันมากกว่าหนึ่งครั้งอย่างหลีกเลี่ยงไม่ได้ คุณต้องระมัดระวังในการใช้งาน หมายเหตุ: คุณสามารถทำได้ด้วยO(N log N)
ความซับซ้อนมันเป็นเรื่องยุ่งยาก
ที่เกี่ยวข้อง: การคำนวณจำนวนของ“ ผู้รุกราน” ในการเปลี่ยนแปลง
วิธีการ 2 (สุ่ม)
- สุ่มคู่ตัวอย่าง
(i,j)
ที่ใดi != j
- สำหรับแต่ละคู่ให้ตรวจสอบว่า
list[min(i,j)] < list[max(i,j)]
(0 หรือ 1)
- คำนวณค่าเฉลี่ยของการเปรียบเทียบเหล่านี้แล้วทำให้เป็นมาตรฐานด้วย
N choose 2
โดยส่วนตัวแล้วฉันจะใช้วิธีการสุ่มถ้าคุณมีความต้องการที่แน่นอน - ถ้าเพียงเพราะมันง่ายที่จะใช้
หากสิ่งที่คุณต้องการคือค่า ( z'
) ระหว่าง-1
(เรียงจากมากไปน้อย) ถึง1
(เรียงจากมากไปหาน้อย) คุณสามารถแมปค่าด้านบน ( z
) ซึ่งอยู่ระหว่าง0
(เรียงจากมากไปหาน้อย) และ1
(เรียงจากมากไปหาน้อย) ลงในช่วงนี้โดยใช้สูตรนี้ :
z' = -2 * z + 1