2012-07-26 11 views
6

0xc0003000から0xc04a0144までのメモリアドレスのリストがあり、リストには多くのギャップと< 4096のエントリがあります。それはコンパイル時に知られており、私はそれを完璧にハッシュしたい。の完全なまたは完全なハッシュに近いアドレス

しかし、完全なハッシュをオンラインで検索すると、ほとんどがハッシュ文字列に関連した情報が得られ、翻訳がうまくいかないようです。

明確にするには、実行時にメモリアドレスを取得し、ハッシュにすぐに入っていることを確認したいと思います。現在私は答えを見つけるために平均で約8ループのバイナリ検索を使用しています。

どのようなツリーを私は樹皮すべきですか?

+0

方法でテスト? – Rsh

+0

'ビットセット'を試しましたか? – jxh

+0

私は基数ツリーが疎の整数値検索のための最良の探索木だと思います。 –

答えて

3

ここにgperfのサンプルプログラムがあります。サンプルデータにNULと改行を含めて、失敗を起こさないことを証明しました。 addrs.gperfとして

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <inttypes.h> 
#include <arpa/inet.h> 
%} 
%% 
"\xc0\x01\x02\x03" 
"\xc0\xff\xff\xff" 
"\xc0\xff\x00\xff" 
"\xc0\x0a\xff\xff" 
%% 
int main(int argc, const char **argv) 
{ 
    int i; 

    for(i=1;i<argc;++i) { 
     uint32_t addr = ntohl(strtoul(argv[i], 0, 16)); 
     if(in_word_set((char *)&addr, 4)) 
      printf("0x%08"PRIx32" is in the list.\n", htonl(addr)); 
     else 
      printf("0x%08"PRIx32" is not in the list.\n", htonl(addr)); 
    } 
    return 0; 
} 

保存し、コンパイルして、Bツリーや赤、黒のようなバランスの取れた木は約

gperf -l addrs.gperf > addrs.c 
gcc addrs.c -o addrs 
./addrs c0000000 c0010203 c0ffffff c00affff c0ff0aff c0ffff00 c0ff00ff 
+0

gperfが実際にこの目的のために使用されるように設計されていれば、はるかに洗練され、少し速く走るでしょう。 –

+1

これは、私がやっていたことでうまく動作し、バイナリ検索(10,000,000ループ)より約40%高速です。基数ツリーはバイナリ検索とほぼ同じになりましたが、わずかに改善されました。 –

関連する問題