文章目录
一、散列表(哈希表)
1.1 实现一个基于链表法解决冲突问题的散列表
(i) 拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组T[0…m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于 1,但一般均取α≤1.
#define SIZE 10 //哈希表大小为10
//定义哈希表数据结构
typedef struct hashNode
{
int data;
struct hashNode *next;
}hashNode;
struct hashNode HashLink[SIZE];
int m; //大小为全局变量
//初始化哈希表
void initHashTable()
{
int i;
m=SIZE;
for(i=0;i<m;i++)
{
HashLink[i].data=i;
HashLink[i].next=NULL;
}
}
//哈希函数建立
int hashFunc(int key)
{
return key%m; //取余法
}
//哈希表插入,用链表法避免冲突
int insertHashLinklist(int key)
{
int i=0;
hashNode *p;
p=(hashNode*)malloc(sizeof(hashNode));
p->data=key;
while(hashFunc(key) != hashLink[i].data) //查找位置
i++;
//将p结点插入到位置i的哈希链表中,头插
p->next=hashLink[i].next;
hashLink[i].next=p;
return i;
}
//查找
int findHash(int key)
{
int addr=hashFunc(key);
int i=0;
hashNode *p; //p指向哈希表首地址
if(!hashLink[addr].next) //若开始哈希表无元素,直接返回
{
printf("元素%d不在哈希表中\n",key);
return 0;
}
p=hashLink[addr].next;
while(p!=NULL && (p->data!=key))
{
p=p->next;
i++;
}
if(p->data==key)
{
printf("元素%d不在哈希表中,地址为%d \n",key,addr);
return 0;
}
else
{
printf("元素%d不在哈希表中\n",key);
return 0;
}
return 0;
}
1.2 实现一个 LRU 缓存淘汰算法
LRU是一种应用在操作系统上的缓存替换策略,和我们常见的FIFO算法一样,都是用于操作系统中内存管理中的页面替换,其全称叫做Least Recently Used(近期最少使用算法),算法主要是根据数据的历史访问记录来进行数据的淘汰,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
#include <iostream>
#include <hash_map>
#include <list>
#include <utility&g