无需使用密钥即可高效搜索哈希表

时间:2013-11-18 05:35:18

标签: c++ search hashtable

我有一个包含歌曲列表的哈希表。通过将歌曲的标题翻译成ascii字符并使用此编号[%table size]作为键,将每个歌曲节点插入到表格中。每个歌曲节点中还有一个“艺术家”字段。如果我想显示特定艺术家的每首歌曲,我是否可以在不搜索整个表格中的每个节点的情况下这样做?我在下面提供了插入和散列方法。另外,哈希函数的适当名称是什么?

标题文件:

struct song {
    string title;
    string artist;
    song* next;
};

class hash {
public:
    hash();
    int Hash_Key(string key); // For determining the hash key for a string
    // Do I need to use multiple hash functions or multiple strings?
    int Add_Item(string title, string artist); // for adding song to hash table
private:
    static const int tableSize = 7;
    song* HashTable[tableSize];
};

实现:

int hash::Add_Item(string title, string artist) {
    int index = Hash_Key(name);
    if(HashTable[index]->title == "empty") { // if first item at this index
        HashTable[i]->title = title;
        HashTable[i]->artist = artist;
    }
    else { // if not the first item at this index
        song* temp = HashTable[index];
        song* n = new song;
        n->title = title;
        n->artist = artist;
        n->next = NULL;
        while(temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = n;
    }


    return 0; // temporary
};

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

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

    index = hash % tableSize; // remainder of the sum of ascii values of key
                              // divided by tableSize
    return index;
}

1 个答案:

答案 0 :(得分:0)

可能最好创建一个新的“艺术家 - &gt;歌曲*”地图,并在添加/删除项目时使这两个地图保持最新。