def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
Çevrimiçi deneyin!
Sıfır indeksleme kullanır.
Basit bir fikir ile hızlı bir algoritma. Bunun yerine girdi listesini sırasını değiştirmek amacıyla gerekirse için yakın olarak bunu yapmak için (1,2,...,n) aşağıda kanıtlanmış mümkün olduğunca, biz, sadece bir çeşit olması gerektiği. Bunun yerine NN ediyoruz yana (1,2,...,n) , biz benim meydan gibi, girdi listesiyle aynı şekilde emrettiğini permütasyon seçmek bir sipariş taklit (tekrarlarını olabilir girdi hariç). (Düzenleme: Miles , Dennis'in aynı cevaba sahip olduğu bu daha özdeş zorluğa dikkat çekti .)
İddia: liste permütasyonu l olan mesafe en aza indirir (1,2,...,n) bir l kriteri.
Kanıt: diğer bazı permütasyon düşünün l′ ait l . Biz daha iyi olamaz kanıtlamak edeceğiz l sıralanmış.
İki endeksleri al i,j bu l′ olduğu, dışı düzeni vardır burada i<j ama l′i>l′j . Onları takas etmek mesafeyi artırmak olamayacağını göstermektedir (1,2,...,n) . Takasın bu iki unsurun katkısını şu şekilde değiştirdiğini not ediyoruz:
|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 pdaha sonra hedeflerini değiştirebilir ve aynı toplam mesafeyi yürüyebilirler. Ve sonra, takas edilen varış yerlerine p kullanmak yerine en başından beri yürümeleri daha kötü olamazp sağ taraftaki toplam mesafeyi veren bir yol noktası olarak .
Bu nedenle, iki-dışı amacıyla elemanları sıralama l′ olan mesafesini sağlar (1,2,...,n) küçük ya da aynı. Bu işlemi tekrarlamak sonunda l sıralayacaktır . Yani, l sıralanmış olan en az şekilde iyi olarak l′ herhangi bir seçim için l′ hangi vasıta bunu optimum olarak veya optimum için bağladılar.
Not bu tek özelliği (1,2,...,n) aynı algoritma herhangi bir sabit listeye mesafeyi en aza indirmek için belirli bir listesini permüte için çalışacak bu yüzden, kriteri olmasıdır kullanılan.
Kodda tek amaç, z=zip(l,range(len(l)))
eşit olmayan elemanlar arasında aynı karşılaştırmaları korurken, giriş elemanlarını ayrı yapmak, yani bağlardan kaçınmaktır. Eğer girişin tekrarlanmasını garanti etmediysek, bunu kaldırabilir ve edinebiliriz lambda l:map(sorted(l).index,l)
.
v
daha büyük olacağı garanti ediliyor0
mu? Ya da en azından değil0
mi?