2014-08-28 15 views
5

Ben Ruby dışındaki bazı dillerde, bir Dizi arama Ç olduğuna inanıyoruz (1) veri başlar ve dizi düzenliyor verilerin boyutuna göre endeksini çarpın ve sonra o bellek yerine nerede biliyor çünkü .Neden bir Array O (1) araması yapılır?

Ancak Ruby, bir Dizi farklı sınıflardan nesneler olabilir, bu nedenle nasıl O (1) karmaşıklık bir arama yapmak yönetir?

+0

İlk paragraf ikinci paragraf çelişki, bu yüzden değil çelişkili hale getirmek için düzenlenmiş. Bahsetmediğiniz belirli bir diliniz varsa, o zaman bunu netleştirin. – sawa

+0

sawa, siz daha iyisiniz. Düzenleme için teşekkürler. MR Ruby ve Rubinius için – blackghost

cevap

6

Ne @Neil Slater ... biraz daha ayrıntı, söz konusu

heterojen, farklı büyüklükteki nesneleri dizisini depolamaya temelde iki mantıklı yaklaşım vardır: Bir tek başına olarak

  1. Mağaza nesneleri - ya da iki kere - linked list, önceki ve/veya sonraki nesnelere işaretçilerden önce gelen her bir nesne için depolama alanı. Bu yapı, dizinin geri kalanı etrafında geçiş yapmaksızın keyfi noktalara yeni nesneler eklemeyi çok kolay hale getirme avantajına sahiptir, ancak büyük bir dezavantajı, bir nesneyi kendi pozisyonuna göre genellikle O(N) olmasıdır, çünkü birinden başlamak zorundasınız. listenin sonuna gelin ve n-th'e varıncaya dek node-by-node atlayın.

  2. deposu bir tablo ya da tek tek nesnelerin sürekli boyutlu işaretçiler dizisi. Bu arama tablosu, bitişik düzenli düzende sabit boyutlu öğeler içerdiğinden, tek tek hedeflerin adreslerine bakmak O(1); Tablo, yalnızca CBS tarzı bir dizidir; buradaki arama, RISC CPU mimarilerinde bile sadece 1 adet makine talimatı alır.

(bireysel nesneleri depolamak için tahsis stratejileri Sorunuza de hemen ilgili ilginç ve karmaşık, ama değil.) Perl/Python/Ruby gibi

Dinamik diller hemen hemen # tüm opt Genel amaçlı liste/dizi tipleri için 2. Başka bir deyişle, listeye rasgele konumlarda nesneleri yerleştirmekten daha verimli arama yaparlar, bu da birçok uygulama için daha iyi bir seçimdir.

Ruby'nin uygulama ayrıntılarını bilmiyorum, ancak Python'un list tipindeki performans ve tasarımı harika ayrıntılarla effbot.org'da açıklandığı gibi oldukça benzer.

4

Onun uygulanması muhtemelen gerçek nesnelere işaret ederek, hafıza adreslerinin bir dizi içerir. Bu nedenle, dizi boyunca döngü yapmadan arama yapmaya devam edebilir.

+4

: Dahili * tüm * Ruby nesneleri C aynı temel tipi vardır ('VALUE' olarak adlandırılan bir' # define' atıfta, bu nedenle bazı uygulamalarda değişebilir). Bazen bir "VALUE" bir işaretçi olarak kabul edilir, bazen (ör. Küçük tamsayılar için) öğenin kodlanmış bir değeridir. Yine de bir Array içinde saklanan bu sabit uzunluktaki 'VALUE' terimleridir. Bu ayrıntıyı eklerseniz, * muhtemelen * bırakabilirsiniz. –

+0

@NeilSlater Yorumunuzu uygun yanıt olarak yazın: D Tahmin yanıtımı silerim. – lulalala

İlgili konular