ruby中数组#uniq方法的时间复杂度是多少?
谁能告诉我ruby内部使用哪个算法使用ruby中数组#uniq方法的时间复杂度是多少?,ruby,Ruby,谁能告诉我ruby内部使用哪个算法使用数组#uniq方法从ruby数组中删除重复项?按原样摊销O(n)。来自: 静态值 rb_ari_uniq(值ari) { 值散列,uniq,v; 龙我; 如果(RARRAY#LEN(ary)使用散列(由Object#hash方法提供)比较元素,则将散列与Object#eql? 来源:这取决于您所谈论的“内部结构”。目前有7种可用于生产的Ruby实现,Ruby语言规范没有规定任何特定的算法。因此,这实际上取决于实现 例如,这是: 这是: RubyHash ha
数组#uniq
方法从ruby数组中删除重复项?按原样摊销O(n)。来自:
静态值
rb_ari_uniq(值ari)
{
值散列,uniq,v;
龙我;
如果(RARRAY#LEN(ary)使用散列(由Object#hash方法提供)比较元素,则将散列与Object#eql?
来源:这取决于您所谈论的“内部结构”。目前有7种可用于生产的Ruby实现,Ruby语言规范没有规定任何特定的算法。因此,这实际上取决于实现
例如,这是:
这是:
RubyHash hash=makeHash();
if(realLength==hash.size())返回makeShared();
RubyArray result=newrubyarray(context.runtime,getMetaClass(),hash.size());
int j=0;
试一试{
for(int i=0;i
时间复杂度是线性时间,即O(n),因为它使用哈希来实现
算法
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;
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;