Auto-implémentation de la fonction de hachage (conception de carte de hachage)

Concevoir une carte de hachage sans utiliser de bibliothèque de table de hachage intégrée

La conception comprend les éléments suivants:

put (key, value): Insérez la paire de valeurs de (key, value) dans la table de hachage. Si la valeur correspondant à la clé existe déjà, mettez à jour cette valeur.
get (key): retourne la valeur correspondant à la clé donnée, si la clé n'est pas incluse dans la carte, renvoie -1.
remove (clé): si la clé existe dans la carte, supprimez la paire de valeurs.
Envoyez le titre original

Dans cette question, j'utilise la méthode d'adresse de chaîne pour résoudre le conflit de hachage, et le conteneur vectoriel stocke l'adresse du nœud de hachage;

Définition de la structure:

Nœud:
Insérez la description de l'image ici

struct Node
{
    
    
	int key;//存放key值
	int val;//存放对应的value
	Node* next;//指向结点的指针
	//自定义参数列表初始化节点
	Node(int key, int val) :key(key), val(val), next(nullptr) {
    
    }
};

Définition de classe:

class MyHashMap {
    
    
public:
	vector<Node*> vec;//用一个存放节点地址的容器充当头结点
	int length = 1000;
	/** Initialize your data structure here. */
	MyHashMap() {
    
    
		//vec = vector<Node*>(length, new Node(-1, -1));//初始化vec容器
		//生成length长度的节点,并初始化key、val域为-1、-1,将其地址依次放入vec中
		vec.resize(length);//给vec分配空间
		vec.assign(length, new Node(-1, -1));
	}

	/** value will always be non-negative. */
	void put(int key, int value) {
    
    
		Node* head = vec[key % length];//哈希函数寻找插入位置
		Node* prevNode = head;//设置前节点
		head = head->next;//head先走一步
		while (head) {
    
    
			if (head->key == key)//说明哈希中存在该节点
			{
    
    
				head->val = value;//更新val值
				return;
			}
			head = head->next;
			prevNode = prevNode->next;
		}
		//出循环,说明没找到这个节点,直接插入
		Node* newNode = new Node(key, value);//初始化该节点key值val值
		prevNode->next = newNode;//将新节点链接到哈希表
	}

	/** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */
	int get(int key) {
    
    
		Node* head = vec[key % length];//哈希函数寻找位置
		head = head->next;
		while (head) {
    
    
			if (head->key == key) {
    
    
				//找到节点,直接返回
				return head->val;
			}
			else if (head->key == -1)
				return -1;//未找到
			head = head->next;
		}
		return -1;
	}

	/** Removes the mapping of the specified value key if this map contains a mapping for the key */
	void remove(int key) {
    
    
		Node* head = vec[key % length];//哈希函数寻找位置
		Node* prevNode = head;
		head = head->next;//head:先走一步了兄弟!
		while (head) {
    
    
			if (head->key == key) {
    
    
				prevNode->next = head->next;
				return;
			}
			else if (head->key == -1)
				return;
			head = head->next;
			prevNode = prevNode->next;
		}

	}
};

Je suppose que tu aimes

Origine blog.csdn.net/Genius_bin/article/details/113392477
conseillé
Classement