単語を Trieデータ構造 に挿入する時間の複雑さについてはかなりの情報がありますが、スペースの複雑さについては詳しくはありません。
スペースの複雑さはO(n**m)
であると思います。ここで、
n
:possible character count
m
:average Word length
たとえば、使用可能な文字がa
およびb
の場合、n
は2であり、単語の平均の長さm
は5
、最悪のケースは32
(2**5
)のスペース使用量ではないでしょうか?
これはこの例の私の視覚化です:
w
をトライの中の単語の量とする。次に、境界O(w*m)
は、トライ内の最大文字数を表すだけなので、はるかに便利です。これは、明らかにスペースの境界でもあります。
ある意味で、はい、O(n**m)
も正しい境界です。ほとんどの場合、これはほとんど役に立ちません。たとえば、平均サイズが_w = 200
_で、アルファベットサイズが_m = 100
_である_n = 50
_ワードは、O(50**100)
になり、ユニバースに収まりません! ...他の境界はO(200*100)
になります。
トライ自体は、キーを暗黙的にパスとして格納するデータ構造の総称です。グーグルで試してみると、このようにキーが格納されている検索データ構造には複数の異なる実装があり、それぞれに異なるスペースの複雑さが存在することがわかります。私の個人的な研究から頭に浮かぶのは、サイズRの配列を使用するRウェイトライです(キーが任意のキーである場合ASCII文字、Rは256になります)、参照を格納します。したがって、この構造の各ノードはサイズRの配列にメモリを割り当てる必要があるため、スペースの複雑さの観点から、このトライはO(RN)ここでNはキーの数。
私が研究した別のトライは、キーの追加文字への参照を格納するために配列の代わりにリンクリストを使用するDeLabrandaisトライです。メモリの観点からは、このトライは実際にはより良いです。おそらく部分的に空になる1つの巨大なチャンクを割り当てるのではなく、追加の文字ごとに必要に応じてメモリを割り当てます(格納されたキーの文字の不均等な分布を想定しています)。ただし、この構造では、参照配列への直接アクセスが失われ、リンクされたリストを走査する必要が生じる可能性があるため、キーの検索に時間がかかります。漸近的に、DLBトライ(私は思うが、間違っている可能性があります)は依然としてO(RN)ですが、前述のキーの文字の不均等な分布により、ほとんどの場合、そのメモリ消費量は実質的に優れています。
これを考えるもう1つの方法は、スペースがO(kN)
であることです。ここで、k
は可能な文字の数です(マッピングを格納するために配列を使用していると想定)、N
は数値ですトライ内のノードの。
より意味のあることに、クライアントの観点から、スペースの複雑さはO(mn)
です。ここで、m
は挿入された文字列の平均の長さ、n
は単語の数です。この計算はハッシュマップマッピングを想定しており、O(mn)
は共通のプレフィックスを考慮しないため、上限を与えます。