2

データ構造に名前と姓を格納する効率的な方法があり、姓または名のいずれかを使用して検索できますか?私は名字のバイナリ検索ツリーを考えます。名前を検索すると効率的です。しかし、姓を検索しようとすると効率的ではありません。姓のあるBSTをもう1つ検討することもできます。それを効率的に実装するためのアイデアは何ですか?問題はどのような場合名前と姓を格納するアルゴリズムとデータ構造

文字列名[] = { "B"、 "C D"}。

実行時に動的にこのディレクトリを拡張する必要がある場合は、永続ストレージなしで を指定する必要があります。ディレクトリは最終的に数百または の数の名前に成長し、姓または名で検索可能でなければなりません。

これで、保存するハッシュテーブルを作成することはできません。何か案は?

+1

問題はやや漠然とそうです(多分、非同期呼び出しに)現在のノードの後に​​すべての葉を横断することにより、部分的名称の提案を得ることができるこの方法は、あなたは、単一の文字列を与えたいです一致する最後または最初の名前を検索します。最後に姓と姓で検索しますか?または名前/姓の組み合わせを検索しますか?最初の2つのケースでは、別々のBSTを使用していますが、最後のケースではBSTにネストされたBSTと一緒に行くことができます – pasha

+0

アドレスブックのシナリオとして想像することができます。私たちはemp.setName( "A"、 "J")、emp.setName( "B"、 "C")のような名前のリストを与えられています...私はempの詳細を取得する必要があります。または姓 – klaks

+0

これは上記のシナリオでも機能しますか? – klaks

答えて

7

2つのハッシュテーブル:1つは名から人まで、もう1つは姓から人までです。

シンプルです。

+0

このソリューションは簡単ですが、効率的だと思いますか?同じデータに対して2つのハッシュマップが必要ですか? – klaks

+2

これは高速です:いずれかの検索の平均O(1)。挿入と除去は平均O(1)であり、空間はO(n)です。あなたは同じデータを2回保存しておらず、ルックアップテーブルを保存しています。私はあなたがこれよりも漸進的に良くなるとは思わない。私は連絡先の数がどれくらいあるか分かりませんが、これがメモリのボトルネックであることはわかりません。 –

0

アイデアはかなり良いですが、ここで別のオプションがあります:ハッシュテーブルを実装する方法は?

最初のハッシュテーブルは、ファーストネームをキーとして使用し、関連付けられた値は、ラストネームまたはNameオブジェクトへのポインタになります。第2のハッシュテーブルは、名前としての最初の名前またはポインタを値としてキーとしてラストネームを使用する。

個人的に、値を選択するために、もっと多くの情報(誕生などのデータ)を保存したい場合にこのメソッドを使用すると便利です。

0

また、Javaに固有のDoes Java have a HashMap with reverse lookup? ...を参照してください。しかし、データ構造に関する議論はどの言語にも関連しています。

双方向ソートマップなどの構造では、範囲の検索も可能です(デュアルハッシュテーブルではできません)。

0

名前でのみ検索する必要がある場合、または姓で検索する必要がある場合は、2つのハッシュマップが最適です(データを複製していないことに気づき、パーティションを作成していますが)姓と名の両方を1つのハッシュマップに入れ、その2つの名前を区別しません。

2

トライに名前と性格を入れてみませんか?ボーナスとして

、あなたも

+0

Trieはハッシュと同じくらい速く、ハッシュの衝突を取得しません。 – Raz

関連する問題