模拟散列表
时间:2021-07-13
本文章向大家介绍模拟散列表,主要包括模拟散列表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
开放寻址法
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 200010,null = 0x3f3f3f3f; int h[N]; int find(int x) { int t = (x % N + N) % N; while(h[t] != null && h[t] != x) { t ++; if(t == N) t = 0; } return t; } int main(void) { char op[2]; int n,x; memset(h,0x3f,sizeof h); scanf("%d",&n); while(n --) { scanf("%s%d",&op,&x); if(*op == 'I') { h[find(x)] = x; } else { if(h[find(x)] == x) printf("Yes\n"); else printf("No\n"); } } return 0; }
以取余完的地址存入,如果冲突了就往后顺延.
memset以字节存,int是4字节,所以是存入4个0x3f.
拉链法
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 100003; int h[N],e[N],ne[N]; int idx; void insert(int x) { int k = (x % N + N )% N; e[idx] = x; ne[idx] = h[k]; h[k] = idx ++; } bool find(int x) { int k = (x % N + N) % N; for(int i = h[k]; i != -1 ; i = ne[i]) { if(e[i] == x) return true; } return false; } int main(void) { memset(h,-1,sizeof h); int n,x; scanf("%d",&n); char op[2]; while(n --) { scanf("%s%d",op,&x); if(*op == 'I') { insert(x); } else { if(find(x) == true) printf("Yes\n"); else printf("No\n"); } } return 0; }
用链式向前星存,数组模拟链表,如果取余完的地址冲突了,就在表头插入.
拉链法和开放寻址法都行.看个人喜好选择就行.
原文地址:https://www.cnblogs.com/sherluoke/p/15008640.html
- 维吉尼亚密码及程序实现
- 迪菲-赫尔曼密钥交换
- 分布式系统组件之配置中心
- github 提交报403 forbidden的错误解决
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
- redis主从集群搭建及容灾部署(哨兵sentinel)
- 浅谈ASP.NET的Postback
- redis配置详解(中英文)
- 我所理解的Remoting(1):Marshaling & Activation[下篇]
- 5分钟短视频,带你走进日志易SPL,助你日志分析更容易
- Unity Application Block 1.2 for Silverlight - December 2008
- 算法学堂 - 二分查找及其变形
- Zookeeper权限管理与Quota管理
- 刘鹏:保大还是保小?无人汽车也将面临这样的道德窘境
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- leet笔记-62.不同路径
- leet笔记-63.不同路径II
- 五分钟C语言实现数据结构 之 二叉树链式存储
- 视频上云/网络穿透/网络映射服务EasyNTS前端切换页面卡顿如何优化?
- [译] 在 Vue 组件中分离 UI 和业务逻辑
- Android Notes|BottomNavigationView 爱上 Lottie
- Android Notes|玩转 ShapeableImageView
- 前端技术 Webpack(学习 Webpack 的原因,Webpack 快速入门)
- 每日一问第1期 | 截取字符串
- 动态规划此一篇就够了 万字总结
- 每日一问第2期 | final, finally, finalize 的区别?
- 当return遇到try、catch、finally时会发生什么?
- 五分钟C语言数据结构 之 二叉树层次遍历
- 为何IntelliJ IDEA比Eclipse好在哪里?
- 五分钟C语言数据结构 之 二叉树中序遍历