1.hash表:
既是数据结构 又是算法 哈希法 散列表 散列法
特点:查找效率非常高2.应用:
编程语言的函数查找、加密解密、非对称加密
任何数据 生成 固定长度的一个串 sha1 md5
3.关键的三要素:
①数据范围
②合适的hash函数 查找数据的方式 返回数据存放地址
③解决冲突的办法
不同数据 通过第二步的hash函数返回地址相同 要区分存储
存储十进制整数:(可能出现的数字0-9999)
三层数组 利用十进制数每个位上的数在 0-9之间 这种规律①数据的范围:0-9999
②hash函数:数组下表的映射
③解决冲突的方法:
最后一个节点变成一个链表去存储(依次去遍历即可.)。
可能的冲突是,705和1705的冲突等等类似的
- #include
- #include
- #include
- //解决冲突 用链表
- struct Node
- {
- int data;
- Node* pNext;
- };
-
- //hash表结构
- struct HashTable
- {
- Node**** pArr;
- };
-
- //Node* arr[10][10][10];
-
- Node* createNode(int data);
- //初始化hash表
- void initHash(HashTable* pHash);
- //往hash表中放数据
- void push(HashTable* pHash, int data);
- //hash函数
- Node* findDataFromHash(HashTable* pHash, int data);
-
- int main()
- {
- HashTable hash;
- initHash(&hash);
-
- int n;
- int data;
- Node* pTemp;
- while (1)
- {
- printf("1 - 插入\n");
- printf("2 - 查找\n");
- printf("3 - 退出\n");
- scanf("%d", &n);
- switch (n)
- {
- case 1:
- printf("请输入插入数据:"); scanf("%d", &data);
- push(&hash, data);
- printf("插入完毕!\n");
- break;
- case 2:
- printf("请输入查找数据:"); scanf("%d", &data);
- pTemp = findDataFromHash(&hash, data);
- if (pTemp)
- {
- printf("找到了:%d!\n",pTemp->data);
- }
- else
- {
- printf("木有找到\n");
- }
-
- break;
- case 3:
- return 0;
- break;
- }
- }
-
- while (1);
- return 0;
- }
-
- //往hash表中放数据
- void push(HashTable* pHash, int data)
- {
- //1 创建节点
- Node* pNew = createNode(data);
- //2 寻址
- int bai = data / 100 % 10;
- int shi = data / 10 % 10;
- int ge = data % 10;
-
-
- Node* pTemp = pHash->pArr[bai][shi][ge];
- if (pTemp)
- {//3 解决冲突
- //3.1 找到最后一个节点
- while (pTemp->pNext) pTemp = pTemp->pNext;
- //3.2 新节点成为最后一个节点的下一个节点
- pTemp->pNext = pNew;
- }
- else
- {//本来为空,说明没有数据
- pHash->pArr[bai][shi][ge] = pNew;
- }
- }
-
- //hash函数
- Node* findDataFromHash(HashTable* pHash, int data)
- {
- int bai = data / 100 % 10;
- int shi = data / 10 % 10;
- int ge = data % 10;
-
- Node* pTemp = pHash->pArr[bai][shi][ge];
-
- while (pTemp)
- {
- if (data == pTemp->data) return pTemp;
-
- pTemp = pTemp->pNext;
- }
- return NULL;
- }
-
- //初始化hash表
- void initHash(HashTable* pHash)
- {
- pHash->pArr = (Node****)malloc(sizeof(Node***)* 10);//第一层
- for (int i = 0; i < 10; i++)
- {
- pHash->pArr[i] = (Node***)malloc(sizeof(Node**)* 10);//第二层
- for (int j = 0; j < 10; j++)
- {
- pHash->pArr[i][j] = (Node**)malloc(sizeof(Node*)* 10);//第三层
- memset(pHash->pArr[i][j], 0, sizeof(Node*)* 10);
- }
- }
- }
-
- Node* createNode(int data)
- {
- Node* pNew = (Node*)malloc(sizeof(Node));
- pNew->data = data;
- pNew->pNext = NULL;
- return pNew;
- }