Qualcuno può dirmi quale algoritmo è utilizzato internamente da Ruby per rimuovere i duplicati da un array di ruby usando il metodo Array#uniq
?qual è la complessità temporale del metodo array # uniq in ruby?
7
A
risposta
5
Dal 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;
Ha O(N)
complessità
3
Ammortizzato O (n) come uses Hash internally.
1
It compares elements using their hash (provided by the Object#hash method) then compares hashes with Object#eql?.
Fonte: https://github.com/ruby/ruby/blob/trunk/array.c#L3976
3
Dipende da che "interni" si sta parlando. Ci sono 7 implementazioni di Ruby pronte per la produzione in uso corrente e la Specifica del linguaggio Ruby non prescrive alcun algoritmo particolare. Quindi, dipende davvero dall'implementazione.
esempio, questo è 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
E questo è 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
La complessità ora è tempo lineare cioè O (n) in quanto utilizza Hash per l'implementazione interna del Algoritmo .
Problemi correlati
- 1. Qual è la complessità temporale dell'albero trasversale?
- 2. Qual è la complessità temporale di HashMap.containsValue() in java?
- 3. Qual è la complessità temporale di questa funzione in Scheme?
- 4. Qual è la complessità temporale della mia funzione?
- 5. Qual è la complessità temporale delle ricerche HTML DOM
- 6. Qual è la complessità temporale di iterazione TreeSet?
- 7. Qual è la complessità temporale di questo ciclo while?
- 8. La complessità temporale del conteggio degli ordinamenti
- 9. La complessità temporale del seguente algoritmo?
- 10. Complessità temporale della sottostringa Java()
- 11. La complessità temporale di Math.Sqrt()?
- 12. complessità temporale di javascript .length
- 13. Qual è la migliore complessità del puzzle N-Queens?
- 14. Qual è la complessità temporale di una chiamata size() su una LinkedList in Java?
- 15. La complessità temporale per l'ordinamento Shell?
- 16. Qual è la complessità temporale dell'aggiunta di un elemento all'inizio di ArrayList?
- 17. Quale sarebbe la complessità temporale dell'algoritmo del triangolo pascal
- 18. Perché la complessità temporale di questo ciclo non è lineare?
- 19. Complessità temporale ricerca alfa beta
- 20. Complessità temporale di una funzione
- 21. La complessità del tempo per java ArrayList
- 22. Qual è la complessità temporale di un elenco per impostare la conversione?
- 23. Analisi algoritmi per complessità temporale
- 24. Haskell GHC: qual è la complessità temporale di un pattern che corrisponde a N costruttori?
- 25. Qual è la complessità asintotica di List.Add?
- 26. Javascript ES6 complessità computazionale/temporale delle raccolte
- 27. Qual è la complessità temporale della lettura di un file da un filesystem Linux?
- 28. La complessità temporale delle operazioni di set python?
- 29. Qual è il simbolo del metodo per + = in ruby?
- 30. Java Math.pow (a, b) complessità temporale