数据结构---散列表与字符串

一、散列表(哈希表)

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(近期最少使用算法),算法主要是根据数据的历史访问记录来进行数据的淘汰,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

LeetCode 146
代码参考

#include <iostream>
#include <hash_map>
#include <list>
#include <utility&g
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值