散列表(也叫哈希表)

直接寻址法

  • 取关键字或关键字的某个线性函数值为散列地址。即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相关推荐

  1. 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...

    散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...

  2. (5)散列冲突处理:开放定址法

    前面我们讲了一些设计散列函数的方法,从前面的除留余数法的例子也可以看出,我们设计得再好的散列函数也不可能完全避免冲突,这就像我们再健康也只能尽量预防疾病,但却无法保证永远不得病一样,既然冲突不能避免, ...

  3. 散列表(开放定址法)

    散列表(开放定址法) 1.线性探测法 将具体的值输入到哈希函数中,映射出的具体的哈希表中的下标索引.当下标索引冲突时. 离散链表法:将重复了的值用链表的方式挂在对应索引的链表下. 线性探测法:一个位置 ...

  4. 对散列冲突的处理——开放定址法

    对散列冲突的处理--开放定址法 之前聊了聊用分离链接法解决散列冲突的问题,这次就来聊聊对散列冲突的另一种解决办法:开放定址法.开放定址法分为线性探测,平方探测,双散列三种方法. 开放定址法 分离链接法 ...

  5. 冲突处理方法----开放定址法

    1 前言 常用处理冲突的思路: 换个位置: 开放地址法 同一位置的冲突对象组织在一起:链地址法 2 开放定址法(Open Addressing) 一旦产生了冲突(该地址已有其它元素),就按某种规则去寻 ...

  6. PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数

    文章目录 题目分析 题目链接 题目分析 来源:acwing 本题的分析见另一道PAT的题目:PAT甲级1078 Hashing:[C++题解]哈希表.哈希表开放寻址法.二次探测法链接的题目就是让建立h ...

  7. python list去重并删除某些元素_使用Python实现list(列表)中的重复元素删除,例如: X= [1,1,2,a,a,[1,2,3]] 去重后:X= 「1,2,a,[1,2...

    题目要求的实质是列表内部元素的去重,有两种思路:第一种,删除的思路,判断列表中的元素是否出现重复,如果有重复,删除重复出现的元素直到剩下最后一个:第二种,添加的思路,新建空列表,将新列表中不包含.原列 ...

  8. 双链表——双链表的定义及其基本操作(初始化、头插法尾插法建表、插入、查找、删除、判空等)

    文章目录 双链表的定义 双链表上的操作 初始化 插入操作 建立双链表 头插法建立双链表 尾插法建立双链表 遍历操作 求双链表的长度 查找操作 按值查找 按位查找 删除操作 判空操作 完整代码及实例 总 ...

  9. 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...

    本文将会以插入排序为例,介绍算法与数据结构的基础部分. 插入排序 排序可以说是整个算法中最为基础,最为重要的一部分,而插入排序正是排序算法中最简单的一种解决办法. 什么是排序问题? 输入:n个数的一个 ...

最新文章

  1. php 中curd表达啥,CURD语句的基本语法和PDO中操作数据表的基本步骤实例演示增删改查命令 2019年07月24日 23时10分...
  2. ExtJs4学习(七)MVC中的Store
  3. elasticsearch api中的Delete By Query API操作
  4. C#的Timer解析(转)
  5. 硬核项目 | 用Arduino做一个神奇的悬浮灯!
  6. 教你10分钟对接人大金仓EF Core 6.x
  7. 大厂面试必问!50w字+的Java技术类校招面试题汇总
  8. java计算器问题反馈,Java开发网 - 求教计算器问题(急~~~)
  9. golang学习的点点滴滴:if、switch使用
  10. html语言标记说明,HTML中注释标签的使用方法
  11. 室内装修app开发,尽享绿色生活
  12. c语言变量 集体备课,(最新整理)数学集体备课活动记录2
  13. 毕业设计 基于大数据住房数据分析与可视化 - python
  14. Win10 LTSB/LTSC 录音机、图片查看器、便签
  15. 分布式之分布式事务、分布式锁、分布式Session
  16. 18 - java基初 数组介绍 冒泡排序
  17. K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路
  18. pip安装包下载地址
  19. 遭七旬叔公欺负长达八年 17岁女孩怀孕5个月
  20. 苹果CMS模板MxPro主题V 2.0版本全解密影视源码+一键采集+搭建教程

热门文章

  1. vr的延迟和渲染效率优化与Nvidia VRWorks
  2. 回应UE4 Unity将很快让开发者在虚拟现实里构建虚拟现实
  3. 关于Element UI中select组件中遇到的问题
  4. 理解和使用SQL Server中的并行
  5. C语言实现的RSA算法程序
  6. 收集系统性能数据并通过gnuplot绘图
  7. drupalchina--如何翻译及如何上传翻译的内容?
  8. 手工杀毒之“三十六计”
  9. 分析原因型思维模型框架_分析营销型网站优化效果不佳的主要原因
  10. 长沙湘江科技学校计算机信息,长沙湘江科技中等职业学校简介|长沙湘江科技中等职业学校介绍...