日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构-散列查找

發(fā)布時(shí)間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构-散列查找 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

散列函數(shù):一個(gè)把查找表中的關(guān)鍵字映射成該關(guān)鍵字對(duì)應(yīng)的地址的函數(shù),記為Hash(key)=Addr。
散列函數(shù)可能會(huì)把兩個(gè)或以上的不同關(guān)鍵字映射到同一地址,稱(chēng)這種情況為”沖突“,這些發(fā)生碰撞的不同關(guān)鍵字稱(chēng)為同義詞。
一方面,設(shè)計(jì)好的散列函數(shù)應(yīng)盡量減少這樣的沖突;另一方面,由于這樣的沖突是不可避免的,所以還要設(shè)計(jì)好處理沖突的方法。

散列表:是根據(jù)關(guān)鍵字而直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)。也就是說(shuō),散列表建立了關(guān)鍵字和存儲(chǔ)地址之間的一種直接映射關(guān)系。

以下簡(jiǎn)單示例通過(guò)除留余數(shù)法的方式構(gòu)造散列函數(shù),通過(guò)開(kāi)放地址法的方式處理沖突。

// // Created by Administrator on 2018/7/12. // #include "stdio.h" #include "stdlib.h"#define HASHSIZE 10 #define NULLKEY NULL typedef struct {int *elem; //通過(guò)指針的方式代替數(shù)組int size; //當(dāng)前容量 } HashTable;/*** 初始化創(chuàng)建hashtable* @return*/ HashTable createHashTable() {HashTable hashTable;hashTable.size = 0;hashTable.elem = (int *) malloc(HASHSIZE * sizeof(int));for (int i = 0; i < HASHSIZE; ++i) {//初始化數(shù)據(jù)hashTable.elem[i] = NULLKEY;}return hashTable; }/*** 通過(guò)除留余數(shù)法構(gòu)造hash函數(shù)* @param key 關(guān)鍵字key* @return*/ int hash(int key) {int hash = key % HASHSIZE;return hash; }/*** 向hashtable中插入元素* @param hashTable* @param key* @return*/ HashTable put(HashTable hashTable, int key) {int addr = hash(key);while (hashTable.elem[addr] != NULLKEY) {//該位置已存在元素,使用簡(jiǎn)單的開(kāi)放地址法處理沖突addr = (hash(key) + 1) % HASHSIZE;}hashTable.elem[addr] = key;hashTable.size++;return hashTable; }/*** 查找元素在hashtable中的位置* @param hashTable* @param key* @return*/ int search(HashTable hashTable, int key) {int addr = hash(key);int elem = hashTable.elem[addr];while (elem != key) {addr = (addr + 1) % HASHSIZE;elem = hashTable.elem[addr];if (elem == NULLKEY || addr == hash(key)) {//遍歷完成 仍然沒(méi)有找到return -1;}}return addr; }int main() {HashTable hashTable = createHashTable();for (int i = 5; i < 15; i++) {hashTable = put(hashTable, i);}int key = 14;int addr = search(hashTable, key);printf("查找到key=%d的元素,地址=%d", key, addr);printf("\nhashtable 當(dāng)前容量=%d", hashTable.size); }

總結(jié)

以上是生活随笔為你收集整理的数据结构-散列查找的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。