Skip to content

enh: ハッシュテーブルのclearメソッドの備考追加#1450

Merged
faithandbrave merged 23 commits intocpprefjp:masterfrom
math-hiyoko:complexity_of_hash_table_clear
May 30, 2025
Merged

enh: ハッシュテーブルのclearメソッドの備考追加#1450
faithandbrave merged 23 commits intocpprefjp:masterfrom
math-hiyoko:complexity_of_hash_table_clear

Conversation

@math-hiyoko
Copy link
Copy Markdown
Contributor

@math-hiyoko math-hiyoko commented May 18, 2025

概要

close #1449

std:: unordered_setやstd:: unordered_mapをはじめとするハッシュテーブルのclearメソッドについて、その規格が定義する「計算量」(オブジェクトに対する操作の数)は本関数呼び出し前のコンテナの要素数に比例するものとされている。
しかし、GCC libstdc++, LLVM libc++ などの多くの実装では実行時間は概ね bucket_count() + size() に比例する。
#1449 (comment)

また、このメソッドはバケットのために確保された動的メモリを解放することを保障していない。

gccの実装: https://github.com/gcc-mirror/gcc/blob/fd50d2a24adaff9a9ba749fd0a1eb5a5c5ee35a8/libstdc%2B%2B-v3/include/bits/hashtable.h#L2707-L2720
clang LLVMの実装: https://github.com/llvm/llvm-project/blob/ad060dfa4c910e8253ba328be947ef70f6597326/libcxx/include/__hash_table#L1338-L1348

これを受けて、該当するメソッドの計算量に関する記述に備考を追加したものである

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 18, 2025

プレビュー (HTML) (更新時刻: 2025-05-30 02:07:40 JST)

  • Commit: 5079252
  • プレビューの生成には時間がかかります (3~5分)。進捗状況はこちらをご確認ください。

変更記事一覧

※ソース (.md) に直接変更のあった記事を列挙しています。グローバル修飾や変換規則の変更による変化は考慮していません。

@math-hiyoko math-hiyoko marked this pull request as draft May 18, 2025 10:02
@math-hiyoko math-hiyoko changed the title fix: ハッシュテーブルのclearメソッドの計算量に関する記述修正 enh: ハッシュテーブルのclearメソッドの備考追加 May 20, 2025
@math-hiyoko math-hiyoko marked this pull request as ready for review May 21, 2025 03:40
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
@akinomyoga
Copy link
Copy Markdown
Member

akinomyoga commented May 22, 2025

あとこれは今回の PR に留まる話ではないですが、計算量が〇〇に比例するという表現は、ちょっと違和感があるかもです。改めて自身に問うてみると以下の2点がある気がします。

  • 計算量 (complexity) 自体がコンテナサイズが大きくなる極限で"どのような関数と比例するか"という概念もしくは"アルゴリズムのクラス"なので、それが〇〇と比例するというのは変な気がする。
  • また、比例というと厳密に比例していそうな気がしてしまいますが、計算量が線形というのは実際には極限において計算時間が線形の関数で上から抑えられるという意味なので、単純に比例と言い換えられるのか疑問。

@faithandbrave
Copy link
Copy Markdown
Member

ぼくも比例という言い方には違和感がありますが、いい表現が思いつかないところではあります。

Co-authored-by: Akira Takahashi <faithandbrave@gmail.com>
@math-hiyoko
Copy link
Copy Markdown
Contributor Author

計算量が〇〇に比例するという表現は、ちょっと違和感があるかもです
ぼくも比例という言い方には違和感がありますが、いい表現が思いつかないところではあります。

計算量はバケット数をcとしてO(c)となる
計算量はバケット数cに対してO(c)となる

と言ったところでしょうか?少なくとも #1450 (comment) で述べられている問題点はクリアできていそうな気がします。

@akinomyoga
Copy link
Copy Markdown
Member

個人的には、規格には linear って書いてあるのだから素直に「線形」で良い気がしています:

計算量は〇〇に対して線形となる。

これが規格に一番忠実です。或いは線形というのは cpprefjp 読者に対して分かりにくいという配慮でしょうか。

Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
@math-hiyoko
Copy link
Copy Markdown
Contributor Author

math-hiyoko commented May 25, 2025

個人的には、規格には linear って書いてあるのだから素直に「線形」で良い気がしています:

良いと思います。
この場合、
「時間計算量はバケット数と全要素数の和に対して線形となる。」
という表現は許容されるでしょうか?

#1450 (comment) だからこれは気にしなくて良いですね

math-hiyoko and others added 2 commits May 26, 2025 00:34
Co-authored-by: Koichi Murase <myoga.murase@gmail.com>
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
@math-hiyoko
Copy link
Copy Markdown
Contributor Author

一旦ご指摘いただいた内容は全て反映しました
ご確認ください

Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
math-hiyoko and others added 3 commits May 27, 2025 21:07
@math-hiyoko
Copy link
Copy Markdown
Contributor Author

コメントいただいたものは全て反映しました

@yumetodo
Copy link
Copy Markdown
Member

だいぶ煮詰まって固まってきた気配がするので読んでみました。

swap技法の紹介の部分ですが、これってvectorだと一見して非自明なのでshrink_to_fitが導入され、それでで行うべしとなったものですよね。

unordered_map/setコンテナについてswapによって同種のことが達成できるというのは、現状の備考のように記載いただいてもなお自明に理解できるものではない気がしており、
余力があればでいいのですが、その根拠を注釈として追加することを検討していただけないでしょうか?
(そこまでのモチベーションはないということでしたら無視していただいて構いません)

@math-hiyoko
Copy link
Copy Markdown
Contributor Author

math-hiyoko commented May 27, 2025

少し話が逸れてしまう気もするのですが、

  • メモリを確実に解放したいときには以下のように操作を行う
std::unordered_multiset<int> tmp;
s.swap(tmp);

とありますが、これだとtmpがスコープ抜けるまではメモリ解放されませんよね

その観点で

s = std::unordered_multiset<int>();

の方が良い気がするし、現状記載されているswapによるやり方が「なお自明に理解できるものではない」問題も解消できると思いました

@math-hiyoko
Copy link
Copy Markdown
Contributor Author

s = decltype(s)();

の方が綺麗かも

@Raclamusi
Copy link
Copy Markdown
Member

s = decltype(s)(); は以下のような状況で使えないので、swap技法から変えるなら s = std::unordered_set<int>(); の方がいいと思います。

void f(std::unordered_set<int>& s) {
    s = std::unordered_set<int>();  // ok
    //s = decltype(s)();  // error!
}

@faithandbrave
Copy link
Copy Markdown
Member

decltypeは併記して紹介してもいいとは思いますが、リファレンスサイトなので明確であった方が読者に伝わりやすいという点でも、型は書いておくと安心感がありそうではあります。

それとすいません。unordered_mapのデフォルトコンストラクタの仕様を確認したところ、以下のように書いてありました。

バケット数の最低が実装依存の、要素を持たない空の unordered_map を構築する。
https://cpprefjp.github.io/reference/unordered_map/unordered_map/op_constructor.html

バケット列が完全に空というわけではないので、その点補足が必要そうです。。。

@faithandbrave
Copy link
Copy Markdown
Member

「バケット数を初期状態まで縮小させたい場合は、」みたいな感じでしょうか…

@math-hiyoko
Copy link
Copy Markdown
Contributor Author

「バケット数を初期状態まで縮小させたいときは、」と書き直し、
swapを使うやり方から新しいインスタンスを代入するやり方に修正しました

Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Comment thread reference/unordered_map/unordered_map/clear.md Outdated
Copy link
Copy Markdown
Member

@faithandbrave faithandbrave left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

忍耐強く対応していただいてありがとうございます。
私としては必要十分な内容になったと思いますので、あとは @akinomyoga さんのコメントに最後対応していただけたらマージできると思います。

@math-hiyoko
Copy link
Copy Markdown
Contributor Author

いただいたご指摘には全て対応しました
みなさん様々な観点から丁寧なコメントをくださってありがとうございました

@faithandbrave faithandbrave merged commit 773e04a into cpprefjp:master May 30, 2025
9 checks passed
@faithandbrave
Copy link
Copy Markdown
Member

マージしましたー。

@math-hiyoko
大変な作業だったと思いますが、対応ありがとうございました。
読者への有用な情報の提供もありがとうございます。
@math-hiyoko さんを編集チームに招待させていただきますね。のちほどGitHubから招待の通知が届くと思います。もしよろしければ今後ともよろしくお願いします。

@math-hiyoko math-hiyoko deleted the complexity_of_hash_table_clear branch May 30, 2025 03:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

std:: unordered_setとstd:: unordered_mapのclearメソッドの計算量の記述について

5 participants