Skip to content

TrieString: 配列・辞書版の文字列ハンドルと厳密な辞書順比較を追加 - #1094

Merged
kemuniku merged 5 commits into
mainfrom
trie-string-handles
Oct 26, 2026
Merged

kemuniku merged 5 commits into
mainfrom
trie-string-handles

Conversation

@kemuniku

@kemuniku kemuniku commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

変更内容

Trie上の節点IDを文字列・要素列のハンドルとして使い、過去の任意のハンドルから末尾追加・親への移動・厳密な辞書順比較を行える構造を追加します。同じ (親, 要素) は同じIDを返し、pop は節点を破棄しません。

  • initTrieStringArray('a'..'z'): 固定char範囲の配列版
  • initTrieStringTable(T): 汎用要素の辞書版(initTrieString() はchar版の短縮形)
  • 公開操作: add, pop, compare, lcp, lcpNode, prefix, toString, toSeq, trie[node,index]。根・長さ・節点数も取得できます。
  • 不正ID・範囲外の位置/長さはreleaseでも ValueError。char列はNUL・非ASCIIを含め0..255のbyte順。GCは含みません。

各節点に親・深さ・1本のskew-binary jumpを持ち、二分累乗表やrolling hashを使いません。正規化した辺によりLCAがLCPに対応します。API契約・使用例・計算量の根拠はNimのdocコメントに記載しています。

計算量

Nは根を含む作成済み節点数、σは配列版の文字種数です。

操作 配列版 辞書版
新規add 償却 O(σ)、σ固定なら償却 O(1) 期待償却 O(1)
pop 最悪 O(1) 最悪 O(1)
compare / lcp / lcpNode / prefix / [] 最悪 O(log(N+1)) 最悪 O(log(N+1))
全体の空間 O(Nσ)、σ固定なら O(N) O(N)

変換は長さLに対し時間・出力空間 O(L+1)。ジャンプ作成そのものは最悪 O(1) ですが、seq拡張を含む追加を最悪 O(1) とは主張しません。辞書版は定数サイズ要素のhash/等値判定/比較と良好なhash分布を仮定し、悪意ある衝突では追加が線形になり得ます。衝突は答えの正しさには影響しません。

検証と差分の範囲

差分は以下の3ファイルだけです。

  • src/cplib/str/trie_string.nim
  • src/verify/str/trie_string_test.nim
  • src/verify/str/trie_string_import_test.nim

テストは既存Trieや他の回帰テストと同じ PROBLEM https://onlinejudge.u-aizu.ac.jp/problems/ITP1_1_A の形式で、全assertion実行後に Hello World を出力します。既存のverification workflowで実行し、専用workflow、verify外のテスト、Markdown、ベンチマークファイルは追加しません。

  • 最終ファイルで Nim 1.6.20 / 2.2.4 / 2.2.6 × C / C++ × debug / release、各2テストの計24実行が成功。
  • 1,046,529組の全比較、600,000組の乱択比較/LCP、200,000組の配列/辞書一致をbrute列と照合。
  • 262,145段の鎖、長い共通接頭辞と分岐、skew不変条件、全byte・汎用整数・強制hash衝突、復元・添字・prefix/LCP節点、不正入力、公開import経由を検査。
  • CIと同じC++ releaseのNim 1.6.20 / 2.2.4で標準出力が厳密に Hello World\n となることを確認。回帰テスト本体はローカルで約2秒、既存の10秒制限内でした。

ローカルの単一VM・1回測定では800,001節点の鎖構築が辞書0.330秒・配列σ=2で0.102秒でした。RSSには入力配列・余剰容量・再確保ピークを含みます。これは追加/親取得/比較の計測で、LCP等の実測や漸近境界の証明ではありません。測定コード・ログ・補足資料はローカルだけに保持しています。

@kemuniku
kemuniku marked this pull request as ready for review October 26, 2026 14:27
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-26T14:29:47.362823Z 1488b1c Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@kemuniku
kemuniku merged commit 12e5b7f into main Oct 26, 2026
2 checks passed
@kemuniku
kemuniku deleted the trie-string-handles branch October 26, 2026 23:51
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.

1 participant