0


0

アナグラムハッシュ関数

このようなことは以前に尋ねられたことは知っていますが、答えは一種の側面追跡でした。

単語を受け取って配列のアドレスを吐き出すハッシュ関数を開発したい。

したがって、たとえば、神を入力した場合:

  1. 単語を並べ替え、d o g

  2. これに対して何らかの機能を実行して、アドレスを取得します。 数

  3. array []のアドレスsome_numberに「犬」を挿入します。

私はどういうわけか邪魔されない関数を作成することはできないようです。

  public static int hashCode(String word){
     char[] x = word.toCharArray();
     Arrays.sort(x);
     int hash = 0;
     for(int i =0; i

これが私の現在のアルゴリズムですが、2つの問題があります。

  • 配列のサイズは非常に大きいため、 衝突

  • いくつかの衝突がまだあります。たとえば、椅子は以下を生成します。 汚れ、パー、椅子

皆さんはどう思いますか? 本当にありがとうございます

5 Answer


2


ハッシュ関数は完全に任意に見えます。 なぜそれを使用していますか?

一般的な、よく知られた、比較的良いハッシュ関数がいくつかあります。ここの説明を参照してください。


0


ハッシュ関数と衝突解決に関する多くの研究があります。 ここから開始します:http://en.wikipedia.org/wiki/Collision_resolution [ハッシュテーブル]


0


私はそれを推測します-あなたのタイトルと `Arrays.sort(x)`関数から - ときに明示的に衝突するハッシュ関数を探していること 2つの文字列は相互のアナグラムです。 これは正しいです? その場合、質問内でその要件を指定する必要があります。

Vinkoが提案した記事は良いものです。 あなたが試すかもしれない他のアルゴリズムのためにhttp://www.concentric.net/~Ttwang/tech/inthash.htm [整数ハッシュ関数]もお勧めします。

がんばろう!


0


すべてのアナグラム(つまり、ハッシュテーブルでアナグラムを見つけやすい)で意図的に衝突する「ハッシュ」を開発したい場合は、文字列を文字の配列に分割しないで、必要な文字を除外します。 (文字以外)を無視して結果を並べ替え、連結してから_that_文字列をハッシュします。

したがって、「犬」と「神」は両方とも「dgo」に絡みつき、それが「犬」のすべてのアナグラムの鍵となります。

Pythonの最新バージョンでは、そのすべての冗長性を次の1行関数に要約できます。

def anagrash(s):
    return ''.join(sorted([x for x in s.lower() if s.isalpha()]))
  1. 次のように使用できます。

anagrams = dict()
for each in phrases:
    ahash = anagrash(each)
    if ahash not in anagrams:
        anagrams[ahash] = list()
    anagrams[ahash].append(each)
  1. フレーズのリストから_possible_アナグラムの辞書を作成します。

次に、アナグラムが見つからなかったすべてのフレーズを除外します。

for key,val in anagrams:
    if len(val) < 2:
        del anagrams[key]

だから、宿題があります。 12行未満のPython。 それをインストラクターが教えている言語に移植し、それをロジックでラップしてフレーズを読み、結果を書き出すことは、すべて学生に課題として残されています。


0


みなさん、助けてくれてありがとう! ほんとうにありがとう。

Uh Clemは正しかった、衝突の意味を本当に理解していなかった、意図的なものだと思った、そしてハッシュアドレスは絶対的なはずだと思ったが、それは非常にへのポインタとして使用されているようだ要素自体ではなく、小さなサブセット。

そのため、正確な家の住所を提供するハッシュ関数の代わりに、3つか4つの家を提供し、それらを介して検索するだけです。 余分な家は衝突です。

あなたの助けに感謝します、あなたは素晴らしい束です。