Czy ktoś może mi powiedzieć, który algorytm jest używany wewnętrznie przez ruby do usunięcia duplikatów z tablicy ruby przy użyciu metody Array#uniq
?jaka jest złożoność czasu metody Array # uniq w ruby?
7
A
Odpowiedz
5
Z docs:
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;
Ma O(N)
złożoność
3
Amortyzowane O (n) jako uses Hash internally.
1
It compares elements using their hash (provided by the Object#hash method) then compares hashes with Object#eql?.
Źródło: https://github.com/ruby/ruby/blob/trunk/array.c#L3976
3
To zależy który "wewnętrzne", o której mówisz. Istnieje 7 gotowych do wykonania implementacji Ruby w bieżącym użyciu, a specyfikacja języka Ruby nie określa żadnego konkretnego algorytmu. Tak naprawdę to zależy od implementacji.
przykład, jest the implementation Rubinius uses:
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
I jest the one from JRuby:
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
Złożony czas czas liniowy tzn O (n), jak to stosuje mieszania dla wewnętrznego wdrażania Algorytm .
Powiązane problemy
- 1. Jaka jest złożoność czasu HashMap.containsValue() w java?
- 2. Jaka jest złożoność czasu HashMap.containsKey() w java?
- 3. Jaka jest złożoność czasu przeglądarek HTML DOM
- 4. Jaka jest złożoność czasu dodawania elementu na początku tablicy ArrayList?
- 5. Jaka jest złożoność czasu w dict.keys() w Pythonie?
- 6. Jaka jest złożoność czasu A * i jak jest uzyskiwana?
- 7. Jaka jest złożoność czasu funkcji liczenia w clojure?
- 8. Jaka jest złożoność czasu przejścia drzew przy użyciu plonu?
- 9. Jaka jest złożoność czasowa inicjowania macierzy?
- 10. Złożoność czasu system.out.println
- 11. Jaka jest najlepsza złożoność zagadek N-Queens?
- 12. Jaka jest złożoność set_intersection w C++?
- 13. Jaka jest złożoność złożonych lin zrównoważonych?
- 14. Złożoność czasu dla java ArrayList
- 15. Czy Ruby uniq zachowuje zamowienie?
- 16. Złożoność czasu mnożenia macierzy w MATLAB
- 17. Złożoność czasu zabawy()?
- 18. Jaka jest złożoność czasu pojawiania się elementów z listy w Pythonie?
- 19. Jaka jest najgorsza złożoność sortowania kubełków?
- 20. Jaka jest złożoność Morris Traversal o (n)?
- 21. Jaka jest złożoność tego kodu manipulacji ciągami?
- 22. Jaka jest asymptotyczna złożoność operacji GroupBy?
- 23. jak obliczyć złożoność czasu sortowania bąbelkowego
- 24. Spark: Jaka jest złożoność czasu algorytmu połączonych komponentów używanego w GraphX?
- 25. Złożoność czasowa podłoży Javy()
- 26. `return` w Ruby Array # map
- 27. Złożoność czasu Java O (n^2/3)
- 28. Array lub hasz w Ruby
- 29. Ruby array reverse_each_with_index
- 30. Jaka jest wydajność metody STL bitset :: count()?