def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
ลองออนไลน์!
ใช้การจัดทำดัชนีเป็นศูนย์
อัลกอริทึมที่รวดเร็วพร้อมแนวคิดง่ายๆ ถ้าเราแทนต้องเปลี่ยนรูปรายการป้อนข้อมูลที่จะทำให้มันใกล้เคียงกับ(1,2,...,n)ที่เป็นไปได้เราควรจะเป็นเพียงแค่การจัดเรียงมันพิสูจน์แล้วว่าเป็นด้านล่าง เนื่องจากเรากำลังแทน permuting (1,2,...,n)เราเลือกการเปลี่ยนแปลงที่สั่งแบบเดียวกับรายการการป้อนข้อมูลที่เหมือนในความท้าทายของฉันเลียนแบบสั่ง (ยกเว้นการป้อนข้อมูลที่อาจจะมีซ้ำ) (แก้ไข: ไมล์ชี้ให้เห็นความท้าทายที่เหมือนกันนี้ซึ่งเดนนิสมีคำตอบเดียวกันนี้)
การอ้างสิทธิ์:การเปลี่ยนแปลงของรายการlที่ช่วยลดระยะทางในการ(1,2,...,n)เป็นlเรียง
พิสูจน์:พิจารณาบางส่วนการเปลี่ยนแปลงอื่น ๆl′ของลิตรlเราจะพิสูจน์ว่ามันไม่ดีไปกว่าการจัดเรียง l
เลือกสองดัชนีi,jที่l′มีออกจากคำสั่งซื้อที่เป็นที่i<jแต่ l′i>l′j J เราแสดงให้เห็นว่าการแลกเปลี่ยนพวกเขาไม่สามารถเพิ่มระยะทางในการ(1,2,...,n) ) เราทราบว่าการแลกเปลี่ยนเปลี่ยนผลงานทั้งสององค์ประกอบดังต่อไปนี้:
|l′i−i|+|l′j−j|→|l′i−j|+|l′j−i|.
Here's a neat way to show this can't be an increase. Consider two people walking on a number line, one going from l′i to i and the other from l′j to j. The total distance they walk is the expression on the left. Since i<j but l′i>l′j, they switch who is higher on the number line, which means they must cross at some point during their walks, call it p. But when they reach p, they could then swap their destinations and walk the same total distance. And then, it can't be worse for them to have walked to their swapped destinations from the start rather than using p as a waypoint, which gives the total distance on the right-hand side.
So, sorting two out-of-order elements in l′ makes its distance to (1,2,...,n) smaller or the same. Repeating this process will sort l eventually. So, l sorted is at least as good as l′ for any choice of l′, which means it as optimal or tied for optimal.
Note that the only property of (1,2,...,n) that we used is that it's sorted, so the same algorithm would work to permute any given list to minimize its distance to any fixed list.
In the code, the only purpose of z=zip(l,range(len(l)))
is to make the input elements distinct, that is to avoid ties, while keeping the same comparisons between unequal elements. If the input we guaranteed to have no repeats, we could remove this and just have lambda l:map(sorted(l).index,l)
.
v
จะมากกว่า0
หรือไม่ หรืออย่างน้อยก็ไม่0
?