誰もが、Array#uniq
メソッドを使ってルビーの配列から重複を取り除くために、どのアルゴリズムが内部的にrubyによって使われているか教えてください。rubyでArray#uniqメソッドの時間計算量はどのくらいですか?
7
A
答えて
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;
それはO(N)
複雑
3
それを償却O(n)としてuses Hash internallyとする。 docsから
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
これは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
それの内部実装のハッシュを使用するように、時間複雑度は線形時間、すなわちO(N)であります アルゴリズム。
関連する問題
- 1. タイムスタンプのみの時間の計算方法と合計時間はどのくらいですか?
- 2. 実行時間の計算はどのくらい正確ですか?
- 3. このアルゴリズムの時間計算量を計算する
- 4. 時間プロファイラの計器でのCPU使用量の計算
- 5. Pythonの - 時間計算量O(N ** 2)
- 6. リカバリーアルゴリズムの時間計算量を計算する
- 7. executeQuery()メソッドの処理時間はどのくらいですか?
- 8. ディレクトリの内容からaを計算するにはどのくらいの時間が必要ですか?
- 9. パッケージ内の各メソッドの時間計算。
- 10. 計算各入出庫時間からの合計時間
- 11. Rubyでタイムゾーンの時間差を計算する方法
- 12. PHPでの時間計算
- 13. heapifyUp()メソッドの時間の複雑さはどのくらいですか?
- 14. ストーム - 計算時間in bolt execute()メソッド
- 15. 時間と分でPythonの時間を計算して差を計算する
- 16. JIRAで費やされた時間はどのくらい自動的に計算されますか?
- 17. 瞬時の時間計算
- 18. 計算時間
- 19. 時間計算
- 20. 時間計算
- 21. 昨日から明日までのJavaScriptの計算時間
- 22. 外出時間から開始時間を差し引いた時間をCで計算するには
- 23. Mysqlの時間計算 - 時間のみ
- 24. 計算速度はどれくらいですか?
- 25. 次の時間までの時間を計算する
- 26. oracleでの勤務時間の計算
- 27. Javaでのシミュレーション時間の計算
- 28. Pythonでの時間の計算(datetime.timedelta?)
- 29. orgモードでの時間の計算
- 30. スウィフトでの残り時間の計算