/ / हैश टेबल में एक स्ट्रिंग की घटनाओं की संख्या की गणना - सी ++, हैशटेबल

हैश टेबल में एक स्ट्रिंग की घटनाओं की संख्या की गणना करना - सी ++, हैशटेबल

मैं C ++ में अपना हैशटेबल क्लास लिख रहा हूं और उपयोगकर्ता को तालिका में प्रत्येक स्ट्रिंग की घटनाओं की संख्या के लिए आउटपुट करने की आवश्यकता है। उदाहरण के लिए, यदि यह इनपुट है: testing, 1, 2, testing, और यह हैश तालिका है (जंजीर, और नोड संकेत के साथ किया जाता है):

[0]->testing, testing
[1]->2
[2]->1

यह उपयोगकर्ता के लिए आउटपुट होगा (गणना, उसके बाद शब्द):

2 testing
1 2
1 1

मेरे पास जो समस्या है, वह यह है कि हैश टेबल में प्रत्येक शब्द में से कितने का ट्रैक रखना है, या इसे कैसे खोजना है। यह प्रश्न लेकिन मेरे कोड में एक और सरणी लागू करने में असमर्थ था।

मैंने भी समाधान की कोशिश की यह प्रश्न, लेकिन यह मेरे द्वारा इंगित / उपयोग किए गए हैशिंग के उपयोग के कारण काम नहीं करता था।

मेरा सवाल है, क्या मुझे एक अलग सरणी का उपयोग करने की आवश्यकता हैतार का ट्रैक रखने के लिए जो पहले से ही उपयोग किया गया है, या हैश टेबल के प्रत्येक सूचकांक के माध्यम से पुनरावृत्ति करने और प्रत्येक स्ट्रिंग की घटनाओं की संख्या का प्रिंट आउट करने का एक आसान तरीका है? मुझे लगता है कि मुझे इसे या तो पूरा करने की आवश्यकता है? insert समारोह या मेरी printData समारोह।

संदर्भ के लिए, यहां मेरा कोड है:

HashTable.h:

#include <string>
#include <iostream>

using namespace std;

struct Entry {
string word;
Entry* next;
};

class HashTable {
public:
HashTable();
HashTable(int);
int hash(string);
void insert(string);
void printData();
int getCapacity() const;
private:
//Member variables
int CAPACITY; // The initial capacity of the HashTable
Entry **data; // The array to store the data of strings (Entries)
};

HashTable.cpp:

#include "HashTable.h"

HashTable::HashTable()
{
CAPACITY = 0;
data = new Entry*[0];
}

HashTable::HashTable(int _cap)
{
CAPACITY = _cap;
data = new Entry*[_cap];

for (int i = 0; i < CAPACITY; i++) {
data[i] = new Entry;
data[i]->word = "empty";
data[i]->next = nullptr;
}
}

int HashTable::hash(string key)
{
int hash = 0;

for (unsigned int i = 0; i < key.length(); i++) {
hash = hash + (int)key[i];
}

return hash % CAPACITY;
}

void HashTable::insert(string entry)
{
int index = hash(entry);

if (data[index]->word == "empty") {
data[index]->word = entry;
} else {
Entry* temp = data[index];
Entry* e = new Entry;
e->word = entry;
e->next = nullptr;

while (temp->next != nullptr) {
temp = temp->next;
}

temp->next = e;
}
}

void HashTable::printData()
{
for (int i = 0; i < CAPACITY; i++) {
if (data[i]->next != nullptr) {
while(data[i]->next != nullptr) {
cout << data[i]->word << " -> ";
data[i] = data[i]->next;
}

cout << data[i]->word << endl;
} else {
cout << data[i]->word << endl;
}
}
}

int HashTable::getCapacity() const
{
return CAPACITY;
}

नोट: मैं मानक C ++ लाइब्रेरी से किसी भी फ़ंक्शन / डेटा संरचना का उपयोग नहीं कर सकता।

उत्तर:

जवाब के लिए 2 № 1

मुझे यहाँ केवल दो विकल्प दिखाई देते हैं

  1. घटनाओं को गिनने के लिए पूरी लिंक की गई सूची को पार करें। प्रत्येक स्ट्रिंग की घटनाओं को गिनने के लिए एक मानचित्र <string, int> का उपयोग करें।

  2. आपको अपनी लिंक की गई सूची को क्रमबद्ध करना चाहिए। इसलिए जब आप एक नया नोड सम्मिलित करते हैं, तो आप इसे इसके सटीक स्थान पर सम्मिलित करेंगे। आप तुलना के लिए strcmp का उपयोग कर सकते हैं। इस तरह से आप हर शब्द को एक ट्रैवर्स में गिन सकते हैं और सिर्फ एक पूर्णांक चर का उपयोग कर सकते हैं, लेकिन आपके डालने का समय और जटिलता बढ़ जाएगी।