数据结构--散列排序--散列表

散列表

 散列查找,我们又回到了查找,

 编译的时候,涉及变量及属性的管理:

  • 插入:新变量的定义
  • 查找:变量的引用

实际上是动态查找问题,查找树AVL树。

两个变量名(字符串)比较效率不高。字符串的比较要一个一个的比下去,时间会比较长,

是否可以把字符串转换成数字,再处理,就快多了。就是散列查找的思想。

已知的查找方法:

  • 顺序查找                                          O(N)
  • 二分查找(静态查找,不适合动态查找)   O(log2N)
  • 二叉搜索数        适合动态查找               O(h) h为树的高度
  • 平衡二叉树        适合动态查找               O(log2n)

二叉树呢要比每个字符,所以AVL树用在刚才的场景中不太合适,还有什么方法

下面是二分查找

插入和删除是一个动态的数据,所以不能用二分查找,那么用什么?

查找的本质:给你这个对象,让你找这个对象的位置。

  • 有序安排对象:全序(二分查找),半序(某些关键字 ,查找树(左子树小,右子树大))。
  • 直接“算出”对象的位置:散列

散列查找法的两项基本工作:

  • 计算位置构造散列函数确定关键词存储的位置
  • 解决冲突应用某种策略解决多个关键词位置相同的问题

时间复杂度几乎是常量O(1),即查找时间与是问题规模无关!

散列表的抽象数据结构

主要是 3 5 6   Find   insert  delete

例题 1

散列表在这个例题中是数组,

例题 2

如果没有冲突,三个都可以在线性时间内完成,

总结

散列(Hashing)查找的基本思想:

  1. 以关键字key为自变量,通过一个确定的函数h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。
  2. 可能不通的关键字会映射到同一散列地址上,即h(key i) = h(key j)(当key i !=key j )称为冲突 ---需要某种冲突解决策略。
时间: 2024-08-10 15:12:10

数据结构--散列排序--散列表的相关文章

容器深入研究 --- 散列与散列码(二)

为速度而散列: SlowMap.java说明了创建一个新的Map并不困难.但正如它的名称SlowMap所示,它不会很快,如果有更好的选择就应该放弃它.它的问题在于对键的查询,键没有按照任何特定的顺序保存,所以只能使用简单的线性查询,而线性查询是最慢的查询方式. 散列的价值在于速度: 散列使得查询得以快速进行.由于瓶颈在于键的查询速度,因此解决方案之一就是保持键的排序状态,然后使用Collections.binarySearch()进行查询. 散列则更进一步,它将键保存在某处,以便能够很快的找到.

java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象联系起来, * @author lenovo * */ //土拨鼠 public class Groundhog { protected int number; public Groundhog(int n) { number=n; } @Override public String toString() { return "Groundhog #" + number

java 散列与散列码探讨 ,简单HashMap实现散列映射表执行各种操作示列

package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象联系起来, * @author lenovo * */ //土拨鼠 public class Groundhog { protected int number; public Groundhog(int n) { number=n; } @Override public String toString() { return "Groundhog #" + number

Java散列和散列码的实现

转自:https://blog.csdn.net/al_assad/article/details/52989525 散列和散列码 ※正确的equals方法应该满足的的条件: ①自反性:x.equals(x) 一定返回true: ②对称性:y.euqlas(x)为true,那么x.equals(y)一定为true: ③传递性:x.equals(y)为true,y.euqlas(z)为true,则z.equals(x)为true: ④一致性:如果x,y中用于等价比较的信息没有变化,那么无论调用y.

容器深入研究 --- 散列与散列码(一)

通常的: 当标准类库中的类被作用HashMap的键.它用的很好,因为它具备了键所需的全部性质. 当你自己创建用作HashMap的键的类,有可能会忘记在其中放置必须的方法,而这时通常会犯的一个错误. 例如:考虑一个天气系统,将Groundhog对象与Prediction对象联系起来. class Groundhog { protected int number; public Groundhog(int n) { number = n; } public String toString() { r

容器深入研究 --- 散列与散列码(三)

如何覆盖hashCode(): 明白了如何散列之后,编写自己的hashCode()就更有意义了. 首先,你无法控制bucket数组的下标值的产生.这个值依赖于具体的HashMap对象的容量,而容量的改变与容器的充满程度和负载因子有关.hashCode()生成的结果,经过处理后称为桶位的下标. 设计hashCode()时最重要的因素就是:无论何时,对同一个对象调用hashCode()都应该产生同样的值.如果在将一个对象用put()添加进HashMap时产生一个hashCode()值,而用get()

【ThinkingInJava】51、散列与散列码

/** * 书本:<Thinking In Java> * 功能:散列与散列码 * 文件:Groundhog.java * 时间:2015年5月3日09:42:54 * 作者:cutter_point */ package Lesson17Containers; public class Groundhog { protected int number; //保护类型,继承之后还是保护类型 public Groundhog(int n) { number = n; } public Strin

散列和散列码(1)

一.前言 1.1== 符号 ==比较的对象内存地址,也就是两个引用指向的地址,相同即指向同一个对象则返回true.Object中的equals(Object obj)方法默认使用的是==方法比较两个对象: public boolean equals(Object obj) { return (this == obj); } 1.2散列数据结构中键类的equals().hashCode()方法必须重载,否则这些数据结构便不能正确处理键: 1.3重载equals(Object obj)原则 重载的e

散列&#183;再散列

目录 再散列 1.定义 2.图解 再散列 1.定义 ? 当散列表的内容达到装填因子\(\lambda\)时,散列表需要进行扩容.扩容后形成新的散列表,将原散列表的值再散列到新的散列表,这个过程叫做再散列. 2.图解 2.1 图解说明 ? 在大小为7的散列表图1中,我们再插入23,此时\(\lambda\)达到上限.我们需要对散列表进行扩展.扩展的大小选择的是原大小的2倍之后的第一个素数.然后我们需要将原来的值,再次散列到新的散列表中,得到图3. 原文地址:https://www.cnblogs.