Yerinde permütasyon uygulama karmaşıklığı


27

Sürpriz, bu konuda yazılar bulamadım - muhtemelen yanlış anahtar kelimeleri aradım.

Yani, biz bir şey bir dizi ve bir işlev var kendi endeksleri üzerinde; f bir permütasyondur.ff

Diziyi göre belleğe ve çalışma zamanına O ( 1 ) ve O ( n ) 'ye mümkün olduğunca yakın şekilde nasıl yeniden düzenleriz ?fO(1)O(n)

Bu görev daha kolay hale geldiğinde başka koşullar var mı? Açık bir şekilde fonksiyonunu bildiğimiz zaman , g'nin f'nin tersi olduğunu mu?gf

Döngüleri takip eden ve her endeks için kendi döngüsünde en az olup olmadığını kontrol etmek için bir döngüyü takip eden bir algoritma biliyorum, ancak yine de, ortalamada daha iyi davranıyor gibi gözükse de , yine de en kötü çalışma süresi var. ..O(n2)


Kolay bir gözlem: Yalnızca öğelerin dizisi değil, aynı zamanda f işlevini içeren dizi de yazılabilirse, O (1) tamsayı kayıtlarını (her biri O (1) uzunluğunda olan O (n) zamanında görevi gerçekleştirmek kolaydır. log n) bitleri) ve her bir döngüyü takip ederek bir öğe için ilave alan. Ancak, eğer f işlevi salt okunur bir depoda (veya f sadece bir kehanet olarak verilir) verilirse bu işe yaramaz, ki bence bu soru bir varsayımdır.
Tsuyoshi Ito

23
Fich ve diğ. 1995 : süre, O ( log n ) boşluk. Aynı zamanda bazı özel durumları tartışır. O(nlogn)O(logn)
Jukka Suomela

Evet, sanırım bir kehanetimiz var.
jkff

3
@JukkaSuomela, bunu bir cevap haline getirmelisin. Ayrıca, keyfi bir permütasyon olduğu düşünüldüğünde , basit bir entropi argümanı O ( n log n ) uzayı ve / veya zamanı verir, bu nedenle zaman ve uzayda O ( n log n ) ' den daha iyi yapabilirseniz şaşırırdım. fO(nlogn)O(nlogn)
user834

Yanıtlar:


4

Seçenek 0: Yerinde İzin Vermesi (1995) Faith E. Fich, J. Ian Munro, Patricio V. Poblete zaman O ( log 2 n ) boşluk.O(nlogn)O(log2n)

Seçenek 1: İzninizi özlü bir veri yapısına sıkıştırarak hile yapın, bkz. Munro http://www.itu.dk/people/ssrao/icalp03-a.pdf .

2. Seçenek: özlü perma depolamak ve hile için ekstra boşluk kullanmak için bir asal döngüsü ayrışma http://oeis.org/A186202

Seçenek 3: Değiştirilen her bir döngünün en büyük endeksini takip edin. Her yineleme için, döngüsündeki her şeyi birer birer taşımak için en büyük görünmeyen dizini kullanın. Görülen bir dizine çarptığında, döngü zaten manipüle edildiğinden tüm bu işleri geri alın. süre, O ( # döngü log n ) boşluk.O(n2)O(#cycleslogn)

Seçenek 4: Değiştirilen her bir döngünün en büyük endeksini takip edin, ancak bunları yalnızca farklı döngü uzunlukları halinde yapın. Her yineleme için, her bir döngü içindeki her şeyi birer birer taşımak için en büyük görünmeyen dizini kullanın. Görülen bir dizine çarparsa, bu işi geri alın, çünkü döngü döngüsü çoktan değiştirildi. zaman, O ( ( # döngüleri _ ile _ aynı _ boyutu ) * log n ) alanı.O(n2distinct_cycle_lengths)O((#cycles_with_same_size)logn)

Seçenek 5: Aynı kağıttan Munro tarafından Seçenek 0, döngüsünü döndürmek p ( i ) eğer ben o döngüde büyük endeksidir. O ( n 2 ) zaman ve O ( log n ) boşluk.i=1..np(i)iO(n2)O(logn)


nlogn

# 5, log (n) faktörü ile # 0'dan daha az alan kullanır.
Chad Brewbaker

1

Permütasyonun döngü gösterimini kullanıyorsanız, o anda izin verilen öğeyi saklamak için 1 ek dizi öğesine ihtiyacınız vardır ve döngüleri daha kötü O (N) işlemlerinde çalıştırabilirsiniz.


2
JKFF zaten döngü takip eden algoritmayı bildiğini söyledi, bu yüzden permütasyonun kendisinin kara kutu (yakın) olarak ele alınmasını açıkça istiyor. Soruya işaret ettiği gibi (neredeyse) bir kara kutudan döngü temsiline dönüşüm O (n ^ 2) zaman alabilir.
Joshua Grochow,

Kara kutu p (i) iyi. Sadece geri dönene kadar döngüyü dolaşıyorsun. Sorun, güncellenen öğelerin listesini depolamak için Kolomogorov'un karmaşıklığından biridir; Munro'nun buna sınırı var. itu.dk/people/ssrao/icalp03-a.pdf
Chad Brewbaker

-2

N maddelerinin herhangi bir permütasyonu N-1 veya daha az değişim kullanarak herhangi bir başka permütasyona dönüştürülebilir. Bu yöntem için en kötü durum oracle, F () için O (n ^ 2) çağrıları gerektirebilir. En az pozisyondan başla. Şu an değiştirmekte olduğunuz konum x olsun.

F (x)> = x ise, x ve F (x) konumlarını değiştirin. Aksi takdirde, F (x) konumunda olan öğenin o anda listede nerede olduğunu bulmalıyız. Bunu aşağıdaki tekrarlamayla yapabiliriz. Y = F (x) olsun. Y> = x: y = F (y) 'ye kadar yap: Sonu. Şimdi x ve y konumlarını değiştirin.


3
O(n2)

Üzgünüm. Bu grup için yeniyim. Bu yöntemi sadeliği nedeniyle seviyorum. Bazen sadeliği verimlilikten daha hızlı buluyorum. O (n) adım gerektiren, ancak O (nlogn) boşluk gerektiren başka bir yöntem biliyorum.
Russell Easterly

1
Russell, O (n log n) alanını zaten ayırıp sıfırlamak bile zaten O (n log n), diğer yönde mi demek istedin?
jkff

Gerçekten ayırma ve sıfır alanınız yok. Temel fikir, F (x)> x olduğunda, öğeyi x konumuna nereye koyduğumuzu hatırlamamız gerekir. Gerçekten büyük n için, bir veritabanı kullanırdım ve sadece x öğesinin taşındığı yerin kaydını tutardım. X, son konumuna ulaştığında kayıt silinebilir.
Russell Easterly

1
Ama neden bunun O (n log n) boşluğu gerektirdiğini söylüyorsunuz?
jkff

-2

Bu yöntem F'nin tersini kullanır ve n bit depolama gerektirir. X, orijinal dizideki bir öğenin konumu ise, G (x) öğenin sıralanan dizideki konumu olsun. B bir n bit dizisi olsun. B'nin tüm n bitlerini 0'a ayarlayın.

X = 1 - n-1: EĞER B (x) == 0 SONRA: y = G (x): YAPMAYIN x == y: x ve y konumlarını değiştir: x (y) = 1: y = G ( y): LOOP: ENDIF: SONRAKI X

Bu yöntem, halihazırda x pozisyonundaki öğeyi nihai pozisyonuna değiştirmeye devam eder. Doğru döngü, x konumuna getirildiğinde, iç döngü sona erer. Her bir takas, en az bir öğeyi öğenin nihai konumuna getirdiğinden, iç Do döngüsü çalışma sırasında n-1 kereden daha fazlasını çıkaramaz. Bu yöntemin O (n) zaman ve mekan olduğunu düşünüyorum.


2
Gazeteye baktın mı? Burada listelediğiniz iki algoritma iki "açık" olanlardır. Makalede, farklı zaman-alanı değişimlerine, özellikle de çok daha az alana sahip daha az belirgin olanları var.
Yuval Filmus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.