2017-11-02 5 views
-1

私は構造体のハッシュテーブルを作成しました。各構造体にはカウントがあります。私はどのように各キーと別のチェーンを通過し、最高のカウントを見つけて配列に追加することができるのが不思議です。ハッシュテーブルの値を比較し、上位Nワードの配列を作成する

struct wordItem 
{ 
    std::string word; 
    int count; 
    wordItem* next; 
}; 

これは私がこれまで行ってきたことです。私の思考プロセスは、各アイテムをすべてのアイテムと比較することです。最初のキーに移動し、各チェーンを横断します。 提案を歓迎します。

void HashTable::printTopN(int n) { 

wordItem* arr[n]; 
wordItem* temp; 
int i; 
for (i=0;i<hashTableSize; i++){ 
    temp = hashTable[i]; 
    while (temp!=NULL){ 
     for (int j = 0; j<n; j++){ 
      if(arr[n]->count<temp->count&&arr[n+1]->count<temp->count){ 

       arr[n]=arr[n+1]; 
       arr[n] = temp; 
      } 
     } 
     temp = temp->next; 
    } 


} 
for (int k = 0; k < n; k++) 

    std::cout<<arr[n]->word<<"--"<<arr[n]->count; 

} また、これはより多くの背景情報のための私のaddWord機能です。

void HashTable::addWord(std::string word) { 
int hash_val = getHash(word); 
wordItem* prev = NULL; 
wordItem* entry = hashTable[hash_val]; 
while (entry != NULL) 
{ 
    prev = entry; 
    entry = entry->next; 
} 
    if (entry == NULL) 
    { 
     entry = new wordItem; 
     entry->count = 1; 
     entry->word = word; 
     entry ->next = NULL; 
     if (prev == NULL) 
     { 
      hashTable[hash_val]= entry; 
     } 
     else 
     { 
      prev->next = entry; 
     } 
} 
    incrementCount(word); 
    entry->word = word; 

} 

HPPのfiie

+0

あなたの 'HashTable'クラスはどのように見えますか?また、 'printTopN()'の 'for'ループでは、' hashTableSize-1'ではなく '0'から始めなければなりません。 – cantordust

+0

それは私がリストの裏から読むつもりだったときでした。私はそれを更新しました。 –

+0

私は参照してください。現在のチェーンまたはテーブル全体から一番上の「N」が必要ですか? – cantordust

答えて

1
struct wordItem 
{ 
    std::string word; 
    int count; 
    wordItem* next; 
}; 

const int STOPWORD_LIST_SIZE = 50; 


class HashTable { 

public: 
    HashTable(int hashTableSize); 
    ~HashTable(); 
    void getStopWords(char *ignoreWordFileName); 
    bool isStopWord(std::string word); 
    bool isInTable(std::string word); 
    void incrementCount(std::string word); 
    void addWord(std::string word); 
    int getTotalNumberNonStopWords(); 
    void printTopN(int n); 
    int getNumUniqueWords(); 
    int getNumCollisions(); 
    int getHash(std::string word); 
private: 


    wordItem* searchTable(std::string word); 
    int numUniqueWords; 
    int numCollisions; 
    int hashTableSize; 
    wordItem** hashTable; 
    std::vector<std::string> vecIgnoreWords = 
      std::vector<std::string>(STOPWORD_LIST_SIZE); 

}; 

N項目の配列を作成します。テーブルの各項目について、配列を調べてcurrent_array_item <= table_item <= next_array_itemかどうかを確認します。はいの場合は、<= current_array_itemの配列内のすべての項目を1つシフトし(配列から最小のものを削除)、current_array_itemの代わりにtable_itemを挿入します。

+0

私はあなたが何を得ると思う、と言っている。私はそれを上に実装しようとしました。同じ配列を各配列のインデックスに書き換えているようです。お勧めですか? –

+0

はい、 'arr [n]'を 'arr [j]'に置き換えてください。配列を繰り返し処理し、適切な位置を見つけたら、現在の項目まで配列*をもう一度*(if文内で)繰り返す必要があります(したがって、 'arr [0] = arr [1 ] '、' arr [1] = arr [2])などです。 – cantordust

+0

また、 'arr [j] - > count <= temp-> count && arr [j + 1] - > count <= temp-> count'を使用して、等しい数の項目をチェックすることもできます。私はそれに応じて私の答えを編集しました。 – cantordust

関連する問題