2012-02-18 11 views
1

私が行っているプロジェクトがありますが、主要な目的はデータ構造に単語リスト(そして15k +をたくさん)をロードしてから検索します構造。私はちょっとした研究をしましたが、ハッシュテーブルがこれに最も適していると言うことができます(私が間違っていれば正解、私も同様に試してみます)STLを使用せずにC++辞書データ構造を実装する方法

ここでは難しい部分があります。このプロジェクトだから、私は自分自身のハッシュテーブルクラスを書くか、かなりうまく動作するクラスを見つけなければならないと言うことができます。どのようにテーブルが基本的なレベルで動作するのか理解していますが、私は自分で全体を書くのに十分な知識はありません。

私はGoogleを見て、適切なサンプルコードが見つかりませんでした。

私の質問は誰でもC++でこれを行う方法を知っていますか、そして/またはどこから始めればよいかわかります。私はテーブルの3つの基本的な機能が必要です:挿入、検索、削除します。

物事あなたはこの考えながら覚えておく:

  1. ナンバー1の懸念はSPEEDです!これは、システムリソースの心配がなく、高速で点灯する必要があります。私が行った読書から、ハッシュテーブルはO(log n)より良いことができます。
  2. STLを使用できません!
+0

どのような言葉ですか?彼らは長さが約10文字で、最初は関連性がありますか、フルテキスト検索を行う長いテキストですか? – ipc

+2

これは宿題のように見えるので、私は答えをあげているわけではありませんが、ハッシュテーブルはあなたが探しているデータ構造ではないことを私は理解しています。 – Thomas

+0

私はC++でそれを行う方法を知っていますが、代わりにSTLを使用して5分で完了させます。なぜあなたはSTLを使えないのかというあなたの要求を詳しく説明できますか? – DXM

答えて

0
+0

link failing 2016-12-29 –

+0

@StephenWoodbridge代替リンクが回答に追加されました。希望が役立つ – fizzbuzz

1

std::unordered_map私は、文字列の、ソートされた配列+バイナリ検索はかなり効率的であるべきだと思うSTL

2

ではありません。

0

全く制限のすべてに明確な、しかし、あなたがSTDから何かを使用することができないと仮定していない、あなたはに以下のような単純なクラスを書くことができ仕事をしなさい。バケツの配列を使用してデータを格納し、ハッシュ関数を使用して文字列を0 ... MAX_ELEMENTSの範囲の数値に変換します。各バケットにはリンクされた文字列のリストが保持されるため、情報を再度取得できます。典型的にはo(1)挿入と検索。

もっと効果的な解決策として、固定長配列ではなくベクトルを使用したいと思うかもしれないことに注意してください。エラーチェックやその他の改善も最小限に抑えられていますが、これが始めるはずです。

注記独自の文字列ハッシュ関数を実装する必要があります。ネット上でこれらを十分に見つけることができます。

class dictionary 
{ 

    struct data 
    { 
     char* word = nullptr; 
     data* next = nullptr; 

     ~data() 
     { 
      delete [] word; 
     } 
    }; 
public: 
    const unsigned int MAX_BUCKETS; 
    dictionary(unsigned int maxBuckets = 1024) 
     : MAX_BUCKETS(maxBuckets) 
     , words(new data*[MAX_BUCKETS]) 
    { 
     memset(words, 0, sizeof(data*) * MAX_BUCKETS); 

    } 

    ~dictionary() 
    { 
     for (int i = 0; i < MAX_BUCKETS; ++i) 
      delete words[i]; 
     delete [] words; 
    } 

    void insert(const char* word) 
    { 
     const auto hash_index = hash(word); 
     auto& d = words[hash_index]; 
     if (d == nullptr) 
     { 
      d = new data; 
      copy_string(d, word); 
     } 
     else 
     { 
      while (d->next != nullptr) 
      { 
       d = d->next; 
      } 
      d->next = new data; 
      copy_string(d->next, word); 
     } 

    } 

    void copy_string(data* d, const char* word) 
    { 
     const auto word_length = strlen(word)+1; 
     d->word = new char[word_length]; 
     strcpy(d->word, word); 
     printf("%s\n", d->word); 
    } 

    const char* find(const char* word) const 
    { 
     const auto hash_index = hash(word); 
     auto& d = words[hash_index]; 
     if (d == nullptr) 
     { 
      return nullptr; 
     } 
     while (d != nullptr) 
     { 
      printf("checking %s with %s\n", word, d->word); 
      if (strcmp(d->word, word) == 0) 
       return d->word; 
      d = d->next; 
     } 
     return nullptr; 
    } 
private: 


    unsigned int hash(const char* word) const 
    { 
     // :TODO: write your own hash function here 
     const unsigned int num = 0; // :TODO: 
     return num % MAX_BUCKETS; 
    } 

    data** words; 
}; 
関連する問題