Array#uniq
yöntemini kullanarak bir ruby dizisinden çift kopyaları kaldırmak için ruby tarafından dahili olarak hangi algoritmanın kullanıldığını söyleyebilir misiniz?Ruby'de Array # uniq yönteminin zaman karmaşıklığı nedir?
7
A
cevap
5
:
static VALUE
rb_ary_uniq(VALUE ary)
{
VALUE hash, uniq, v;
long i;
if (RARRAY_LEN(ary) <= 1)
return rb_ary_dup(ary);
if (rb_block_given_p()) {
hash = ary_make_hash_by(ary);
uniq = ary_new(rb_obj_class(ary), RHASH_SIZE(hash));
st_foreach(RHASH_TBL(hash), push_value, uniq);
}
else {
hash = ary_make_hash(ary);
uniq = ary_new(rb_obj_class(ary), RHASH_SIZE(hash));
for (i=0; i<RARRAY_LEN(ary); i++) {
st_data_t vv = (st_data_t)(v = rb_ary_elt(ary, i));
if (st_delete(RHASH_TBL(hash), &vv, 0)) {
rb_ary_push(uniq, v);
}
}
}
ary_recycle_hash(hash);
return uniq;
It has O(N)
karmaşıklığı
3
Amortize edilmiş O (n) değeri uses Hash internally. docs itibaren
1
It compares elements using their hash (provided by the Object#hash method) then compares hashes with Object#eql?.
Kaynak: https://github.com/ruby/ruby/blob/trunk/array.c#L3976
3
Bu "internals" bahsediyorsun bağlıdır. Mevcut kullanımda 7 adet üretime hazır Ruby uygulaması vardır ve Ruby Language Spesifikasyonu herhangi bir özel algoritma yazmaz. Yani, gerçekten uygulamaya bağlı.
Rubinius.check_frozen
if block_given?
im = Rubinius::IdentityMap.from(self, &block)
else
im = Rubinius::IdentityMap.from(self)
end
return if im.size == size
array = im.to_array
@tuple = array.tuple
@start = array.start
@total = array.total
self
Bu the one from JRuby olup:
Örneğin, bu the implementation Rubinius uses olan
RubyHash hash = makeHash();
if (realLength == hash.size()) return makeShared();
RubyArray result = new RubyArray(context.runtime, getMetaClass(), hash.size());
int j = 0;
try {
for (int i = 0; i < realLength; i++) {
IRubyObject v = elt(i);
if (hash.fastDelete(v)) result.values[j++] = v;
}
} catch (ArrayIndexOutOfBoundsException aioob) {
concurrentModification();
}
result.realLength = j;
return result;
1
zaman karmaşıklığı lineer süresi, bir O (n) bu iç uygulama için karma kullanır algoritması.
İlgili konular
- 1. zaman karmaşıklığı
- 2. Python'da dict.keys() 'nin zaman karmaşıklığı nedir?
- 3. klojürde sayım işlevinin zaman karmaşıklığı nedir?
- 4. Bu İşlevin Şemadaki Zaman Karmaşıklığı nedir?
- 5. zaman karmaşıklığı javascript'in .length
- 6. Swift'in zaman karmaşıklığı Set.indexOf
- 7. Java'da LinkedList'te bir boyutlu() çağrının zaman karmaşıklığı nedir?
- 8. Zaman havza bulmanın karmaşıklığı
- 9. Banker'in algoritması hesaplanan zaman karmaşıklığı
- 10. Hesaplama Zaman Karmaşıklığı Kod
- 11. Math.Sqrt() zaman karmaşıklığı?
- 12. Java'da ayarlanan zaman karmaşıklığı
- 13. Java'da Math.abs'ın zaman karmaşıklığı?
- 14. C++ set_intersection'ın karmaşıklığı nedir?
- 15. Uzun bölümün karmaşıklığı nedir?
- 16. Tam tersi zaman karmaşıklığı Haskell
- 17. Canny kenar detektörünün zaman karmaşıklığı
- 18. A * zaman karmaşıklığı nedir ve nasıl elde edilir?
- 19. Vektör dönüştürmek için zaman karmaşıklığı mat
- 20. İşlem kümesinin karmaşıklığı nedir (liste())
- 21. Bu dize manipülasyon kodunun uzay karmaşıklığı nedir?
- 22. Analiz zaman karmaşıklığı (polinom karşı Poli günlüğü)
- 23. Aşağıdaki kodun zaman karmaşıklığı nedir ve bunu doğrusal veya logaritmik zaman karmaşıklığına nasıl değiştirebilirim?
- 24. ruby array internals
- 25. Array.of (n), Array (n) ve array = [n] arasındaki fark nedir?
- 26. Karşılaştırma işleçlerinin karmaşıklığı
- 27. Save: yönteminin ne zaman kullanılır: NSManagedObjectContext
- 28. Init yönteminin örnek değişkenlerine ne zaman erişebilirim?
- 29. NSObject uyumlu sınıflardaki -self yönteminin amacı nedir?
- 30. NSInvocation sınıfındaki setSelector yönteminin amacı nedir?