Dizi başlatmaya kaydetme


19

Son zamanlarda, başlatılması gerekmeyen dizilere sahip olmanın mümkün olduğunu okudum, yani her bir üyeyi varsayılan değere ayarlamak için zaman harcamak zorunda kalmadan bunları kullanmak mümkün. yani diziyi, başlatmaya gerek kalmadan varsayılan değer tarafından başlatılmış gibi kullanmaya başlayabilirsiniz. (Üzgünüm, bunu nerede okuduğumu hatırlamıyorum).

Örneğin, bunun neden şaşırtıcı olabileceğine dair:

Diyelim ki aralığındaki tamsayıların en kötü durumunu hashtable (ekleme / silme / arama) için modellemeye çalışıyorsunuz .O(1)[1,n2]

bit boyutunda bir dizi ayırabilir ve hashtable içinde bir tamsayının varlığını göstermek için ayrı bitler kullanabilirsiniz. Not: bellek ayırma süresi olarak kabul edilir.n2O(1)

Şimdi, bu diziyi hiç başlatmanız gerekmediyse , bu hashtable üzerindeki işlemlerinin herhangi bir dizisi artık en kötü durumda .nO(n)

Sonuç olarak, işlem dizisi için alanı kullanan ancak zamanında çalışan "mükemmel" bir karma uygulamanız vardır !Θ ( n 2 ) O ( n )nΘ(n2)O(n)

Normalde çalışma zamanınızın en az alan kullanımınız kadar kötü olması beklenir!

Not: Yukarıdaki örnek, seyrek bir kümenin veya seyrek matrisin uygulanması için kullanılabilir, bu yüzden sadece teorik ilgi alanı olmadığını düşünüyorum.

Soru şu:

Başlatma adımını atlamamızı sağlayan veri yapısı gibi bir diziye sahip olmak nasıl mümkün olabilir?


@Aryabhata Bahsettiğiniz referans nedir?
uli

1
"bellek kullanma", "bellek ayırma ama asla erişememe" ile aynı değildir, bu yüzden motive edici "paradoks" un tam olarak mevcut olmadığını düşünüyorum.
Raphael

1
Bence ilk paragraf oldukça açık: aslında varsayılan değer ile dizi doldurmak için zaman ayırmadan, varsayılan bir değere sahip. Cevap, başka birisinin benden önce yazmak için vakti varsa, burada scholar.google.co.uk/… Blogumda
rgrig 19:12

@uli: Bu bir tohumlama sorusu, aslında bunu uzun zaman önce okudum .
Aryabhata

@Raphael: Böyle bir şeyi ilk kez duyduğunuzda hala şaşırtıcı. Paradoksların çoğu değil :-)
Aryabhata

Yanıtlar:


15

Bu, hash dışında başka amaçlar için kullanılabilecek çok genel bir numaradır. Aşağıda (sözde kod) bir uygulama veriyorum.

Her biri n boyutunda üç başlatılmamış , P ve V vektörü olsun . Bunları veri yapımız tarafından talep edilen işlemleri yapmak için kullanacağız. Ayrıca değişken bir p o s sağlıyoruz . İşlemler aşağıdaki gibi gerçekleştirilir:APVnpos

init:
  pos <- 0

set(i,x):
if not(V[i] < pos and P[V[i]] = i) 
  V[i] <- pos, P[pos] <- i, pos <- pos + 1
A[i] <- x

get(i):
if (V[i] < pos and P[V[i]] = i) 
  return A[i] 
else 
  return empty 

dizisi basitçe s e t prosedüründen geçirilen değerleri saklar . V ve P dizileri , A'da belirli bir konumun başlatılıp başlatılmadığını söyleyen sertifikalar olarak çalışır .AsetVPA

Her an 0 ile p o s - 1 arasında değişen öğelerin başlatıldığına dikkat edin. Bu nedenle, bu değerleri A'daki başlangıç ​​değerleri için bir sertifika olarak güvenle kullanabiliriz . Her konum için i içinde A başlatılır, vektör içinde karşılık gelen bir eleman bulunur P değerine eşittir i . Bu V [ i ] ile gösterilmiştir . Bu nedenle, karşılık gelen öğeye bakarsak, P [ V [ i ] ] ve değeri iP0pos1AiAPiV[i]P[V[i]]i, nin başlatıldığını biliyoruz ( P asla yalan söylemediğinden, düşündüğümüz tüm öğeler başlatıldığından). Benzer şekilde, A [ i ] başlatılmazsa, V [ i ] , başlatılmadığından emin olduğumuzdan emin olduğumuzda P konumunda 0 .. p o s - 1 aralığının dışında bir konuma işaret edebilir veya bu aralık içindeki bir konum. Ancak bu özel P [ j ] , A'da farklı bir konuma karşılık gelir ve bu nedenleA[i]PA[i]V[i]P0..pos1P[j]A , bu yüzden A [ i ] ' nin başlatılmadığınıbiliyoruz.P[j]iA[i]

Tüm bu işlemlerin sabit zamanda yapıldığını görmek kolaydır. Aynı zamanda, kullanılan alandır vektörlerin her biri için ve O ( 1 ) değişken için p o s , bu nedenle, O ( n ) , toplam.O(n)O(1)posO(n)


Ancak, tesadüfen ayarlanmış A [ i ] olmadan i'ye eşit olabilir mi? P[V[i]]iA[i]
Robert S. Barnes

Ama sonra pos şimdi V [i] 'den daha küçük olacak değil mi? Çünkü aksi halde şans eseri olmaz. V [i] 'den daha yüksek bir konuma sahip olduğu için, V [i] dizinindeki P değerini özellikle seçtiğimiz belirli bir değere, yani i'ye ayarladığımız anlamına gelir.
Mart'ta

Bunun (taşınabilir) C'de yapılması imkansız bir şeyin klasik bir örneği olduğuna dikkat edin
TLW
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.