任何人都可以請告訴我哪種算法是由紅寶石內部使用從紅寶石數組中刪除重複使用Array#uniq
方法?Ruby中Array#uniq方法的時間複雜度是多少?
7
A
回答
5
從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;
它O(N)
複雜
3
攤銷爲O(n),因爲它uses Hash internally。
1
It compares elements using their hash (provided by the Object#hash method) then compares hashes with Object#eql?.
3
這取決於其 「內部」 你在說什麼。目前有7種可用於生產的Ruby實現,Ruby語言規範並未規定任何特定的算法。所以,這實際上取決於實施。
例如,這是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
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
的時間複雜度是線性的時間,即O(n)的,因爲它使用散列對內部執行 算法。
相關問題
- 1. Collection.toArray()的時間複雜度是多少?
- 2. NavigableMap的floorEntry()方法的時間複雜度是多少?
- 3. list.index(obj)方法的時間複雜度是多少?
- 4. heapifyUp()方法的時間複雜度是多少?
- 5. addFirst(e)和removeFirst()方法的時間複雜度是多少?
- 6. 方案中'assoc'函數的時間複雜度是多少?
- 7. 分時排序算法的時間複雜度是多少?
- 8. AngularJS的髒檢查算法的時間複雜度是多少?
- 9. 爬山算法的時間複雜度是多少?
- 10. 整個算法的時間複雜度是多少?
- 11. 這個算法的時間複雜度是多少?
- 12. 這個算法的時間複雜度是多少?
- 13. 這個算法的時間複雜度是多少?
- 14. 這個算法(代碼)的時間複雜度是多少?
- 15. 通配符匹配算法的時間複雜度是多少?
- 16. 根據Big-O表示法,下列方法的時間複雜度是多少?
- 17. 減少時間複雜度
- 18. 我的代碼中的時間複雜度是多少
- 19. Java中TreeSet的lower()/ higher()的時間複雜度是多少?
- 20. Python中collections.Counter()的時間複雜度是多少?
- 21. TreeSet中有序操作的時間複雜度是多少?
- 22. Python中dict.keys()的時間複雜度是多少?
- 23. Java中LinkedList.getLast()的時間複雜度是多少?
- 24. clojure中count函數的時間複雜度是多少?
- 25. C++中std :: next_permutation()函數的時間複雜度是多少?
- 26. java中lastIndexOf的時間複雜度是多少?
- 27. java中StringBuilder.append()的時間複雜度是多少?
- 28. Python中zip()的時間複雜度是多少?
- 29. java中HashMap.containsValue()的時間複雜度是多少?
- 30. 鏈式散列表中的時間複雜度是多少