哈希表

数据结构实验之查找五:平方之哈希表 SDUT 3377

久未见 提交于 2019-12-20 10:26:41
Problem Description 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=±i^2,i=1,2,3,…,m-1 Input 输入包含多组测试数据,到 EOF 结束。 每组数据的第1行给出两个正整数N(N <= 500)和P(P >= 2N的最小素数),N是要插入到哈希表的元素个数,P是哈希表表长;第2行给出N个无重复元素的正整数,数据之间用空格间隔。 Output 按输入数据的顺序输出各数在哈希表中的存储位置 (hash表下标从0开始),数据之间以空格间隔,以平方探测方法处理冲突。 Sample Input 4 11 10 6 4 15 9 11 47 7 29 11 9 84 54 20 30 Sample Output 10 6 4 5 3 7 8 0 9 6 10 2 1 # include <stdio.h> # include <string.h> # include <stdlib.h> # define inf 0x3f3f3f3f int a [ 1005 ] , hash [ 1005 ] , re [ 1005 ] ; int main ( ) { int n , p , i , j , jj , x ; while ( ~

数据结构之查找运算

Deadly 提交于 2019-12-20 07:26:38
查找运算 查找 线性表的查找 顺序查找(都是从后往前找) 折半查找(二分查找) 分块查找(索引顺序查找) 数表的查找 哈希表(散列表的查找) 查找 查找表可分为两类 静态查找表 仅作查询和检索操作的查找表。 动态查找表 有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素。 关键字 是数据元素(或记录)中某个 数据项 的值,用以标识(识别)一个数据元素(或记录)。 若此关键字可以识别唯一的一个记录,则称之谓“主关键字”。 若此关键字能识别若干记录,则称 之谓“次关键字”。 线性表的查找 顺序查找(都是从后往前找) 顺序查找方法既适用于线性表的 顺序存储结构 ,又适用于线性表的 链式存储结构 。( 无序 ) 时间复杂度为O(n)。 在不等概率查找的情况下,ASLss 在 Pn≥Pn-1≥···≥P2≥P1时取极小值 若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。 折半查找(二分查找) 折半查找要求线性表必须才用 顺序存储结构 ,而且表中元素按关键字 有序 排列。 时间复杂度为O(log2 n)。 算法步骤: 置查找区间初值,low为1,high为表长。 当low小于等于high时,循环执行以下操作: mid取值为low和high的中间值

集合框架__【Set集合】【HashSet】【TreeSet】

谁说我不能喝 提交于 2019-12-19 14:59:32
Set :元素是 无序的,不能重复 Set集合的功能和Collection是一致的,无特有方法 ————HashSet:底层数据结构是哈希表 ————TreeSet:底层数据结构是二叉树 HashSet HasnSet 通过equals方法和hashCode方法来保证元素的唯一性 ———— 如果hashCode相同,还要调用equals判断元素是否相同 ———— 如果hasnCode不同,就不用判断equals ————HashSet方法中的元素是按照哈希表来存储的,所以打印的时候不是无序的 在hashSet中对元素contains、remove等操作时,先判断hashCode,再判断equals 而在ArrayList中对元素的操作只依赖于equals方法 所以HashSet时一般都要覆盖hashCode方法和equals方法 示例: 往HashSet集合中存入自定义对象,姓名年龄相同则视为同一个元素 HashSet示例 在Person类中覆盖 public int hashCode()//覆盖hashCode方法 { System.out.println(this.name+"........hashCode."); return name.hashCode()+age*22; //*22是为了保证哈希值的唯一性 } public boolean equals(Object

哈希表实现电话号码查询系统

十年热恋 提交于 2019-12-19 02:53:47
list.h #pragma once //预防头文件重复引用 #include <stdio.h> #include<stdlib.h> #include<string.h> #include <windows.h> #include<assert.h> #define MAX_N 30 //姓名最大长度 #define MAX_T 15 //电话号码最大长度 #define MAX_A 100 //地址最大长度 //用户信息结构体 typedef struct InfoNode { char _name[MAX_N]; //姓名 char _telephone[MAX_T]; //电话号码 char _address[MAX_A]; //地址 }InfoNode; //输入时以循环双链表存储 typedef struct InfoNode_List { InfoNode* _ListInfo; //结构体指针来存放用户信息 struct InfoNode_List* _next; //指向下一个节点 struct InfoNode_List* _pre; //指向上一个节点 }InfoNode_List; //初始化链表 void InitList(InfoNode_List* pl); //输入用户信息节点 void ScanfNode(InfoNode* pnode); /

数据结构与算法之哈希表结构

↘锁芯ラ 提交于 2019-12-19 00:26:21
一、概念 也称散列表,是指根据关键码值(key-value)而直接进行访问的数据结构,也就是说它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表,也称哈希表。 二、一句话概括 哈希表就是由数组和链表二者结合而成的新型数据结构。数组存放key(经过hash计算后生成的存放key的数组位置),链表存放value。 三、图解 hash算法有很多,比如最简单的哈希算法就是用存放的值去取模数组长度。比如存放元素20,那就是20%5=0,所以20这个元素就存放在数组下标为0的位置,再比如4%5=4,所以元素4存放在数组下标为4的位置。 回想下Java的hashmap,典型的key-value,那么我们put的时候是存放到哪了呢?其实就是key的hash算法得到一个数组下标位置,将其存进去。当然比我说的复杂的多,但是大致原理确是如此。 当我们getKey的时候,首先会根据key进行hash算法得到数组下标位置,查找时间复杂度为O(1)。 四、哈希碰撞 多个key经过hash算法后得到的是同一个值(同一个数组下标),这就称之为哈希碰撞。这时候可以将他们的值都存放在链表中。(毕竟链表是拉链式的,可以往后next next next) 五、Google上机题 Google机试题。 就是让你存储员工信息,员工包含id和name

Java总结篇系列:java.lang.Object

扶醉桌前 提交于 2019-12-18 18:35:51
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解。 Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起。 Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起。作为其他所有类的基类,Object具有哪些属性和行为,是Java语言设计背后的思维体现。 Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入。Object类没有定义属性,一共有13个方法,具体的类定义结构如下图: 1.类构造器public Object(); 大部分情况下 ,Java中通过形如 new A(args..)形式创建一个属于该类型的对象。其中A即是类名,A(args..)即此类定义中相对应的构造函数。通过此种形式创建的对象都是通过类中的构造函数完成。为体现此特性,Java中规定:在类定义过程中,对于未定义构造函数的类,默认会有一个无参数的构造函数,作为所有类的基类,Object类自然要反映出此特性,在源码中,未给出Object类构造函数定义,但实际上,此构造函数是存在的。 当然,并不是所有的类都是通过此种方式去构建,也自然的, 并不是所有的类构造函数都是public。 2

hashmap实现及哈希冲突

寵の児 提交于 2019-12-18 10:02:05
原文: https://www.cnblogs.com/peizhe123/p/5790252.html HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。源码如下: Java代码 public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; //判断当前确定的索引位置是否存在相同hashcode和相同key的元素,如果存在相同的hashcode和相同的key的元素,那么新值覆盖原来的旧值,并返回旧值。 //如果存在相同的hashcode

算法打基础——HashⅡ: 全域哈希与完美哈希

狂风中的少年 提交于 2019-12-18 03:29:53
这一节涉及数学超级多,各种数论知识,各种不明觉厉! 看了几遍,才勉强看懂一些,所以这 篇稍微简单的介绍着两种hash table, 免得瞎说说错了。 这一讲的主要知识点是: 1. 全域哈希及构造 2. 完美哈希 1. 全域哈希及构造 介绍全域哈希之前,要先讨论一下普通哈希的一个缺点。 举个charles举得那个例子:如果你 和一个竞争对手同时为一家公司做compiler的symbol table, 公司要求你们代码共享 (o(╯□╰)o),你们做好后公司评判的标准就是 你俩互相提供一些测试样例,谁的效率高就买 谁的。 然后, 普通哈希的缺点 就出来了:对任意的hash函数h,总存在一组keys,使得 , 对某个槽i。即我总可以找到一组键值,让他们都映射到同一个槽里面,这样效率 就跟离链表差不多了 解决的思想就是:独立于键值, 随机 的选择hash 函数。这就跟快排中为避免最差情况时随机化 版本差不多。但是选取hash function的全局域是不能乱定的,否则也打不到理想的性能。 下面就给出全域哈希的定义: 设U是key的全局域, 设\(\mathcal{H}\) 是哈希函数的有限集合,每一个都是将U映射到 {0,1,..,m-1},即table的槽内。 如果对所有不等的\(x,y\in U\),有 换句话说,就是对于任意的不相等key的x和y, 从哈希函数集中选择一个哈希函数

【计算机笔记】Java 符号表

感情迁移 提交于 2019-12-17 03:01:31
前言 初级实现 1. 链表实现无序符号表 2. 二分查找实现有序符号表 二叉查找树 1. get() 2. put() 3. 分析 4. floor() 5. rank() 6. min() 7. deleteMin() 8. delete() 9. keys() 10. 分析 2-3 查找树 1. 插入操作 2. 性质 红黑树 1. 左旋转 2. 右旋转 3. 颜色转换 4. 插入 5. 分析 散列表 1. 散列函数 2. 拉链法 3. 线性探测法 小结 1. 符号表算法比较 2. Java 的符号表实现 3. 稀疏向量乘法 前言 符号表(Symbol Table)是一种存储键值对的数据结构,可以支持快速查找操作。 符号表分为有序和无序两种,有序符号表主要指支持 min()、max() 等根据键的大小关系来实现的操作。 有序符号表的键需要实现 Comparable 接口。 public interface UnorderedST < Key , Value > { int size ( ) ; Value get ( Key key ) ; void put ( Key key , Value value ) ; void delete ( Key key ) ; } public interface OrderedST < Key extends Comparable <

C#集合

梦想的初衷 提交于 2019-12-17 00:44:30
集合 (Collection)类是专门用于数据存储和检索的类。这些类提供了对 栈(stack) 、 队列(queue) 、 列表(list) 和**哈希表(hash table)**的支持。大多数集合类实现了相同的接口集合类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建Object类的对 象的集合。在C#中,Object类是所有数据类型的基类。 常用的集合类 类 描述和用法 动态数组(ArrayList) 它代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。 哈希表(Hasht able) 它使用键来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。 排序列表(Sorte dList) 它可以使用键和索引来访问列表中的项。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问 各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则 它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。 堆栈(Stack) 它代表了一个后进先出的对象集合