2012-05-05 20 views
2

船にデータを保存するバイナリ検索ツリーを作成しました。検索のキーは音響署名です。int配列をキーとして使用するバイナリツリー(ユークリッド距離)?

ツリーを検索するときに、正しい署名を持つ船か、検索した署名に最も近い船を戻したいと思います。 (どの船がユークリッド距離に最も近いかを見ることによって)。

私が抱えている問題は、実際の数値以外の署名を比較する方法です。これは、実行された検索がバイナリではなくシーケンシャルであることを意味しますか?

アイデア?

+0

ツリーを形成するときに順序付けスキームを選択し、ノードAのキーとして署名Aを、ノードBのキーの署名Bで終わるとします。そのような署名のペアについては、ツリーが形成された後に、Aからのユークリッド距離がBからのものよりも大きくなるような人工署名を作成することができます(Bの署名署名)。したがって、あなたはBをAの* left *サブツリーに入れたいと思っていたでしょう。 – ely

+0

それは私が抱えている問題です。もしそれがあれば、バイナリ検索を使うことしかできませんツリー内では/ is /はツリーで、シーケンシャルサーチではユークリッド距離を計算します。 – lex

+0

問題は、バイナリ検索ツリーでは、ツリーの作成時にノードの順序が固定されていると仮定し、後でツリー内で索引付け/検索するために変更されません。変化する順序でエレメントを検索できるようにするには、これは正しいデータ構造ではなく、可変クエリーシグネチャーからのユークリッド距離は変化する順序としてカウントされます。クエリが変更されると、格納されたデータの順序が変更されます。あなたは、その注文を変更するために支払うペナルティを最小限に抑える構造が必要です。以下の答えは、合理的だと思われるKdツリーを示唆しています。 – ely

答えて

2

あなたがやっていることは、多面的にnearest-neighbour searchになります。バイナリツリーだけではこれを効率的に解決することはできません。スペース区画構造が必要になります。

配列の長さNが小さい場合(1桁)、バイナリツリーの一般化として2^N-aryツリー(quadtree、octree、...)を使用できます。

高次元でもうまくいく人気のある選択肢はKd-treeです。

関連する問題