Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Hash_table

  1. #1
    Ngày gia nhập
    11 2016
    Bài viết
    14

    Mặc định Hash_table

    #include <iostream>
    #include <string>
    #include <vector>
    using std::string;


    int HashTableSize = 8;
    const int a = 3;


    int SimpleStringHash(const string& key, int range)
    {
    int hash = 0;
    for (int i = 0; i < key.length(); i++)
    {
    hash = (hash * a + key[i]) % range;
    }
    return hash;

    }


    class CHashTable {
    public:
    CHashTable();
    ~CHashTable();


    bool Has(const string& key) const;

    bool Add(const string& key);

    bool Remove(const string& key);


    private:
    struct CHashTableNode {
    string Key;
    CHashTableNode* Next;
    explicit CHashTableNode(const string& key) : Key(key), Next(nullptr) {}
    };

    int count = 0;
    void reHash(int HashTableSize);
    std::vector<CHashTableNode*> table;
    };

    CHashTable::CHashTable() :
    table(HashTableSize, nullptr)
    {
    }

    CHashTable::~CHashTable()
    {
    for (int i = 0; i < static_cast<int>(table.size()); ++i) {
    for (CHashTableNode* node = table[i]; node != nullptr {
    CHashTableNode* next = node->Next;
    delete node;
    node = next;
    }
    }
    }

    void CHashTable::reHash(int HashTableSize)
    {
    HashTableSize = HashTableSize * 2;
    std::vector<CHashTableNode*> newTable(HashTableSize, 0);
    std::swap(newTable, table);
    for (int i = 0; i < newTable.size(); i++)
    {
    table[i] = newTable[i];
    }
    }

    bool CHashTable::Has(const string& key) const
    {
    int hash = SimpleStringHash(key, table.size());
    for (CHashTableNode* node = table[hash]; node != nullptr; node = node->Next) {
    if (node->Key == key) {
    return true;
    }
    }
    return false;
    }

    bool CHashTable::Add(const string& key)
    {
    if (count / HashTableSize >= 0.75)
    reHash(HashTableSize);
    int hash = SimpleStringHash(key, table.size());
    for (CHashTableNode* node = table[hash]; node != nullptr; node = node->Next) {
    if (node->Key == key) {
    return false;
    }
    }

    CHashTableNode* newNode = new CHashTableNode(key);
    newNode->Next = table[hash];
    table[hash] = newNode;
    count++;
    return true;
    }

    bool CHashTable::Remove(const string& key)
    {
    int hash = SimpleStringHash(key, table.size());
    if (table[hash] == nullptr) {
    return false;
    }
    CHashTableNode* node = table[hash];
    if (node->Key == key) {

    table[hash] = node->Next;
    delete node;
    count--;
    return true;
    }
    for (CHashTableNode* nodeNext = node->Next; nodeNext != nullptr; node = nodeNext, nodeNext = nodeNext->Next) {
    if (nodeNext->Key == key) {
    node->Next = nodeNext->Next;
    delete nodeNext;
    count--;
    return true;
    }
    }
    return false;
    }

  2. #2
    Ngày gia nhập
    09 2016
    Bài viết
    716

    Lộn chuồng, đây là dot.NET

    Định dạng cho dễ đọc - bb code, ... trong c# không hấp thụ được code c plus plus

    Phọt mô xa 2016

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn