如何在不使用STL的情况下实现C ++字典数据结构

时间:2012-02-18 21:54:45

标签: c++ data-structures stl dictionary

我正在做一个项目,主要目标是将一个单词列表(其中很多是15k +)加载到数据结构中,然后对该结构进行搜索。我做了一点研究,据我所知,哈希表最适合这个(纠正我,如果我错了,我也会调查尝试)

这是一个棘手的部分:我不能在这个项目中使用任何STL。所以据我所知,我将不得不编写自己的哈希表类或找到一个非常有效的哈希表类。我理解表格如何在基本层面上工作但我不确定我是否足够自己写一个完整的表格。

我环顾了谷歌,但找不到合适的示例代码。

我的问题是,是否有人知道如何在c ++中执行此操作和/或我可以找到一些代码来开始。我需要表的3个基本功能:插入,搜索,删除。

当你想到这件事时要记住的事情:

  1. 第一号关注速度!这需要快速点亮,不关心系统资源。从我所做的阅读中,哈希表可以比O(log n)做得更好。考虑使用mutithreading?
  2. 不能使用STL!

5 个答案:

答案 0 :(得分:2)

我认为,排序的字符串数组+二进制搜索应该非常有效。

答案 1 :(得分:1)

std::unordered_map不是STL

答案 2 :(得分:0)

答案 3 :(得分:0)

答案 4 :(得分: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;
};