利用开放定址法实现散列表的创建、插入、删除、查找操作_散列表和IO
散列表(也叫哈希表)
直接寻址法
- 取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。若其中H(key)中已经有值了,就往下一个找,直到H(key)中没有值了,就放进去。
数字分析法
- 分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
平方取中法
- 当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。
折叠法
- 将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。数位叠加可以有移位叠加和间界叠加两种方法。移位叠加是将分割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。
随机数法
- 选择一随机函数,取关键字的随机值作为散列地址,即H(key)=random(key)其中random为随机函数,通常用于关键字长度不等的场合。
除留取余法
- 取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。
散列表中处理地址重复的方法
开放寻址方式
- Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法:1.1. di=1,2,3,…,m-1,称线性探测再散列;1.2. di=12,-12,22,-22,⑶2,…,±(k)2,(k<=m/2)称二次探测再散列;1.3. di=伪随机数序列,称伪随机探测再散列。
再散列法
- Hi=RHi(key),i=1,2,…,k RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。
链地址法
- java中hashSet就是这么做的。同一个hashcode可同时对应多个元素,每个元素之间有个指针。单向连接
建立一个公共溢出区
如果在使用链地址法时,链表过长
IO
java用变量存储数据,用集合存储并管理多个数据,IO负责数据的转移(传输)。
核心:选择一个适合当前场景的流对象,按照正确的流程调用方法。
对于当前的类,考虑两个问题,数据流动方向和数据内容方向:
- 方向数据从外部到当前类中,称为输入:读数据从当前类转移到外面,称为输出:写
- 内容一般情况都是二进制数据,以字节byte为单位,叫字节流。字节流可以处理所有情况特殊情况是,如果数据的内容都是字符,也可以用字符流。
所以流对象一共四类
java提供了四个抽象类:
- 字节流InputStreamOutputStream
- 字符流ReaderWriter
所有操作
- 磁盘操作:File
- 字节操作:InputStream,OutputStream
- 字符操作:Reader,Writer
- 对象操作:Serializable
- 网络操作:Socket
- 缓冲流(类似Stringbuffer)
基本的字符字节操作
输入字符流
- (new String(array,0,length);是将一个字节数组array从0取到length,然后转换成String类型)
public static void main(String[] args) throws Exception { try { //读取文件 FileReader reader = new FileReader("/Users/xutingyu/Documents/Tye/TestFile/tye.txt"); char[] array = new char[10]; int length = 0; while ((length = reader.read(array)) > 0) { //将一个字节数组array从0取到length,然后转换成String类型 System.out.print(new String(array, 0, length)); } reader.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } }
输出字符流
public static void main(String[] args) { String str = "hudhkhdpidsjfpdsifjildsgjidgdfg123123123"; try { FileWriter writer = new FileWriter("/Users/xutingyu/Documents/Tye/TestFile/tye.txt"); writer.write(str); //清空缓冲区 writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } }
一个txt文件的复制,先读再写
public static void main(String[] args) throws Exception { FileReader reader = new FileReader("/Users/xutingyu/Documents/Tye/TestFile/tye.txt"); FileWriter writer = new FileWriter("/Users/xutingyu/Documents/Tye/TestFile/tye1.txt"); char[] array = new char[10]; int length = 0; writer.write("这是复制内容:"); while ((length = reader.read(array)) > 0) { writer.write(new String(array, 0, length)); } writer.flush(); reader.close(); writer.close(); }
一个图片的复制,将字符流换成字节流
public static void main(String[] args) throws Exception { FileInputStream input = new FileInputStream("/Users/xutingyu/Documents/Tye/TestFile/tye.jpg"); FileOutputStream out = new FileOutputStream("/Users/xutingyu/Documents/Tye/TestFile/tye1.jpg"); byte[] array = new byte[1024]; int times = 0; while (input.read(array) > 0) { times++; out.write(array); if (times == 100) { break; } } out.flush(); input.close(); out.close(); System.out.println(times); }
如果再带上注释内容,可以复制半张图,仅仅作为演示效果
缓冲流,在普通流的基础上多封装了一些功能,便于操作
public static void main(String[] args) throws Exception{ FileReader reader = new FileReader("/Users/xutingyu/Documents/Tye/TestFile/tye.txt"); BufferedReader br = new BufferedReader(reader); String str=""; while ((str=br.readLine())!=null) { System.out.println(str); } FileWriter writer=new FileWriter("/Users/xutingyu/Documents/Tye/TestFile/tye1.txt"); BufferedWriter bw=new BufferedWriter(writer); bw.write("dkfkjdgnjknfdlkgn"); bw.newLine(); bw.write("32422312321"); bw.flush(); bw.close(); writer.close(); }
- flush();清空缓冲区
磁盘操作
- 磁盘操作:File类以抽象的方式代表文件(也可以是文件夹)
- 获取或设置文件的属性,创建,删除,查找,重命名
- 创建
- 有两个方法可以创建文件夹mkdir(),返回true/false,需要整个父级目录都存在,如果不存在就返回false,创建也不成功mkdirs(),如果不存在就一路创建出来
//创建 public void create() { String dirname = "/Users/xutingyu/Documents/Tye/TestFile/abc"; File f = new File(dirname); f.mkdir(); }
- 删除:
public void del() { String dirname = "/Users/xutingyu/Documents/Tye/TestFile/bcd/efg/hij"; File f = new File(dirname); f.delete(); }
- Java中File的delete方法,只能删除单个文件或空文件夹,如果文件夹有东西就不能删了
- 如果想直接删除文件夹及其所有内容,自己实现一下递归
public void delAll(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { delAll(f); } else { f.delete(); } } } folder.delete(); }
- 重命名:
public void rename() { String path = "/Users/xutingyu/Documents/Tye/TestFile/"; String picName = "abc"; String newNmae = "bcd"; File file = new File(path + picName); if (file.renameTo(new File(path + newNmae))) { System.out.println("修改成功!"); } else { System.out.println("修改失败"); } }
结尾
本文到这里就结束了,感谢看到最后的朋友,都看到最后了,点个赞再走啊,如有不对之处还请多多指正。
利用开放定址法实现散列表的创建、插入、删除、查找操作_散列表和IO相关推荐
- 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...
散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...
- (5)散列冲突处理:开放定址法
前面我们讲了一些设计散列函数的方法,从前面的除留余数法的例子也可以看出,我们设计得再好的散列函数也不可能完全避免冲突,这就像我们再健康也只能尽量预防疾病,但却无法保证永远不得病一样,既然冲突不能避免, ...
- 散列表(开放定址法)
散列表(开放定址法) 1.线性探测法 将具体的值输入到哈希函数中,映射出的具体的哈希表中的下标索引.当下标索引冲突时. 离散链表法:将重复了的值用链表的方式挂在对应索引的链表下. 线性探测法:一个位置 ...
- 对散列冲突的处理——开放定址法
对散列冲突的处理--开放定址法 之前聊了聊用分离链接法解决散列冲突的问题,这次就来聊聊对散列冲突的另一种解决办法:开放定址法.开放定址法分为线性探测,平方探测,双散列三种方法. 开放定址法 分离链接法 ...
- 冲突处理方法----开放定址法
1 前言 常用处理冲突的思路: 换个位置: 开放地址法 同一位置的冲突对象组织在一起:链地址法 2 开放定址法(Open Addressing) 一旦产生了冲突(该地址已有其它元素),就按某种规则去寻 ...
- PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数
文章目录 题目分析 题目链接 题目分析 来源:acwing 本题的分析见另一道PAT的题目:PAT甲级1078 Hashing:[C++题解]哈希表.哈希表开放寻址法.二次探测法链接的题目就是让建立h ...
- python list去重并删除某些元素_使用Python实现list(列表)中的重复元素删除,例如: X= [1,1,2,a,a,[1,2,3]] 去重后:X= 「1,2,a,[1,2...
题目要求的实质是列表内部元素的去重,有两种思路:第一种,删除的思路,判断列表中的元素是否出现重复,如果有重复,删除重复出现的元素直到剩下最后一个:第二种,添加的思路,新建空列表,将新列表中不包含.原列 ...
- 双链表——双链表的定义及其基本操作(初始化、头插法尾插法建表、插入、查找、删除、判空等)
文章目录 双链表的定义 双链表上的操作 初始化 插入操作 建立双链表 头插法建立双链表 尾插法建立双链表 遍历操作 求双链表的长度 查找操作 按值查找 按位查找 删除操作 判空操作 完整代码及实例 总 ...
- 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...
本文将会以插入排序为例,介绍算法与数据结构的基础部分. 插入排序 排序可以说是整个算法中最为基础,最为重要的一部分,而插入排序正是排序算法中最简单的一种解决办法. 什么是排序问题? 输入:n个数的一个 ...
最新文章
- php 中curd表达啥,CURD语句的基本语法和PDO中操作数据表的基本步骤实例演示增删改查命令 2019年07月24日 23时10分...
- ExtJs4学习(七)MVC中的Store
- elasticsearch api中的Delete By Query API操作
- C#的Timer解析(转)
- 硬核项目 | 用Arduino做一个神奇的悬浮灯!
- 教你10分钟对接人大金仓EF Core 6.x
- 大厂面试必问!50w字+的Java技术类校招面试题汇总
- java计算器问题反馈,Java开发网 - 求教计算器问题(急~~~)
- golang学习的点点滴滴:if、switch使用
- html语言标记说明,HTML中注释标签的使用方法
- 室内装修app开发,尽享绿色生活
- c语言变量 集体备课,(最新整理)数学集体备课活动记录2
- 毕业设计 基于大数据住房数据分析与可视化 - python
- Win10 LTSB/LTSC 录音机、图片查看器、便签
- 分布式之分布式事务、分布式锁、分布式Session
- 18 - java基初 数组介绍 冒泡排序
- K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路
- pip安装包下载地址
- 遭七旬叔公欺负长达八年 17岁女孩怀孕5个月
- 苹果CMS模板MxPro主题V 2.0版本全解密影视源码+一键采集+搭建教程
热门文章
- vr的延迟和渲染效率优化与Nvidia VRWorks
- 回应UE4 Unity将很快让开发者在虚拟现实里构建虚拟现实
- 关于Element UI中select组件中遇到的问题
- 理解和使用SQL Server中的并行
- C语言实现的RSA算法程序
- 收集系统性能数据并通过gnuplot绘图
- drupalchina--如何翻译及如何上传翻译的内容?
- 手工杀毒之“三十六计”
- 分析原因型思维模型框架_分析营销型网站优化效果不佳的主要原因
- 长沙湘江科技学校计算机信息,长沙湘江科技中等职业学校简介|长沙湘江科技中等职业学校介绍...