哈希表

学习C# 哈希表(HashTable)用法

不羁的心 提交于 2020-01-16 01:06:38
学习C# 哈希表(HashTable)用法 1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对. 2. 哈希表使用情景 (1) 某些数据会被高频率查询 (2) 数据量大 (3)查询字段包含字符串类型 (4)数据类型不唯一 3. 哈希表的使用方法 哈希表需要使用的namespace: using System.Collections; using System.Collections.Generic; 哈希表的基本操作: //添加一个keyvalue键值对: HashtableObject.Add(key,value); //移除某个keyvalue键值对: HashtableObject.Remove(key); //移除所有元素: HashtableObject.Clear(); // 判断是否包含特定键key: HashtableObject.Contains(key); 示例代码: using System;

Java基础 集合框架

核能气质少年 提交于 2020-01-15 04:46:41
集合框架 1 概述 集合是用来存储对象的容器 2 特点 1)集合用来存储对象 2)集合的大小是可变的 3 集合与数组区别 1)数组的大小是不可变的,集合的大小是可变的 2)数组可以存储任意类型的数据,而集合只能存储对象(引用数据类型) 4 体系结构(可使用图形解释) 4.1单列集合 集合中只存储值,Conllection类是所有单列集合的顶层父类 4.2双列集合 集合中存储键和值,根据键映射到值,Map是所有双列集合的顶层父类 Collection总结 Collection:集合体系的顶层接口。 Collection集合(接口): |----List集合(接口):存取元素有序、可以存储重复元素、可以存储null、有角标,可以精确控制集合中的每一个元素。 |-----ArrayList集合(类): 1)实现了List接口; 2)底层使用可变数组; 3)方法都是围绕着角标操作的; 4)查询遍历效率比较高,增删的效率比较低; 5)属于线程不安全的集合类; |-----LinkedList集合(类): 1)实现了List接口; 2)底层使用链表结构; 3)方法都是围绕着头和尾来设计的; 4)查询遍历效率比较低,增删的效率比较高; 5)属于线程不安全的集合类; |-----Vector集合(类):底层可变数组,什么都慢,但线程安全,已经被ArrayList集合取代 |----Set集合(接口

Java set接口之HashSet集合原理讲解

試著忘記壹切 提交于 2020-01-15 01:56:15
Set接口 java.util.set接口继承自Collection接口,它与Collection接口中的方法基本一致, 并没有对 Collection接口进行功能上的扩充,只是比collection接口更加严格了。 set接口中元素是无序的,并且都会以某种规则保证存入的元素不出现重复。 简述其特点就是: 不允许存储重复的元素 没有索引,也没有带索引的方法,不能使用普通的for循环遍历 Set接口有多个实现类,java.util.HashSet是其常用的子类 下面介绍一下set接口的实现类HashSet HashSet集合的介绍 java.util.HashSet是set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。 java.util.HashSet底层的实现其实是一个java.util.HashMap支持 HashSet是根据对象的哈希值来确定元素在集合中的存储位置的,因此具有良好的存取和查找性能。 保证元素唯一性的方式依赖于:hashCode与 equals方法。 代码简单理解 import java.util.HashSet; import java.util.Iterator; public class DemoHashSet { public static void main(String[] args) { // 创建set集合

比特币原理详解

一个人想着一个人 提交于 2020-01-14 23:22:18
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人分别称之为ABCD,他们之间发起了3个交易,A转给B10个比特币,B转给C5个比特币,C转给D2个比特币。如果是传统的记账方式,这些交易会记录在银行的系统中,这些信息由银行来记录,我们相信银行不会随意添加、删除或修改一条交易记录,我们也不会关注到底有哪些交易,我们只关注自己的账户余额。而比特币的记账方式为ABCD每个人保存了这样一份账本,账本上记录了上述交易内容,如果每个人账本实时的一致,ABCD就不再需要银行。 比特币是这样做的,每当有人发起一笔交易,他就要将一笔交易广播至全网,由全网中的某一个人,把一段时间内的交易打包好记录到一个区块上,再按照顺序把这些区块,一个一个的链接在一起,进而形成了一个链条,这就是所谓的区块链。 那么问题来了 1、我凭什么要参与这个系统,我为什么要动用自己的计算机资源来存储这些信息呢? 2、以谁的记录为准呢?比如上面的账单顺序,A用户可能是这个顺序

C++哈希表

心不动则不痛 提交于 2020-01-14 06:46:31
https://www.cnblogs.com/slothrbk/p/8823092.html 来源: CSDN 作者: zacharyzqc 链接: https://blog.csdn.net/zacharyzqc/article/details/103940123

【数据结构】(散列表)哈希表的构造

主宰稳场 提交于 2020-01-14 02:30:25
#include < iostream > #include < iomanip > using namespace std; #define NUM 12 // 元素个数 #define HASHSIZE 16 // 哈希表长度 #define MOD 13 // 哈希表可选地址 // 线性处理冲突 void collision(int &p,int c) { p = (p+1) % HASHSIZE; } //查询函数 int searchHash(int hs[],int key,int &p,int &c,void(*cp)(int &,int)) { p = key % MOD; while(hs[p]!=NULL && hs[p]!=key){ // 当对应位置不为空,且不为key时,冲突处理 cp(p,++c); // 冲突次数 c 加一 } if(hs[p]==key){ return 1; } else if(hs[p]==0) return 0; } // 插入函数 int insertHash(int hs[],int key) { int p,c=0; // c 保存冲突次数,p 保存元素的存储位置 if(searchHash(hs,key,p,c,collision)) { return 0; } else if(c<HASHSIZE/2){ hs[p]

Two Sum (c#)

六眼飞鱼酱① 提交于 2020-01-13 05:00:49
Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based. You may assume that each input would have exactly one solution. Input: numbers={2, 7, 11, 15}, target=9 Output: index1=1, index2=2 给定一个整数数组,要求找到数组中的2个值,使他们的和等于给定值,并返回索引位置组成的数组(以1开始的索引) 我的解法:两层循环,从数组的第一个数开始和第j个数做比较,和目标值相同则返回,时间复杂度O(n 2 ) public int[] TwoSum(int[] nums, int target) {

哈希表相关

早过忘川 提交于 2020-01-13 00:20:16
由于哈希表的查找高效性,在平时的算法中用的也比较多。例如:字符串、单词个数统计、只出现一次字符或者数字的统计,两个集合相同元素的查找等等,还有插入删除的高效(链地址法)都可以用哈希表来解决。所以这里对其做一个小小的总结。缺点是可能需要占用额外的内存空间。 一、哈希函数的构造方法 下面介绍五种常用的哈希构造方法: 构造哈希函数的原则是: (1)函数本身便于计算; (2)计算出来的地址分布均匀,即对任一关键字k,f(k)对应不同地址的概率相等,目的是尽可能减少冲突。 1、除留余数法 取关键字被某个不大于哈希表长m的数p除后所得的余数为哈希地址。即: H(key)=key MODE p,p<=m(p的取值最好为素数)。 若冲突较多,可取较大的m和p值。 2、随机法 采用一个伪随机函数做哈希函数,即: H(key)= random(key)。其中random为随机函数。 通常,当关键字长度不等时采用此构造哈希函数比较恰当。 3、平方取中法 当无法确定关键字中那几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。 这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。 例如对于关键key:123。123^2=1522756,H(K)关键字的哈希地址为:227 4、折叠法

数据结构---->哈希表

馋奶兔 提交于 2020-01-12 04:39:53
一、哈希表 哈希表又称散列表。 哈希表存储的基本思想是:以数据表中的每个记录的关键字k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。 在此称该函数H为哈希函数或散列函数。按这种方法建立的表称为哈希表或散列表。 例如,要将关键字值序列(3,15,22,24),存储到编号为0到4的表长为5的哈希表中。 计算存储地址的哈希函数可取除5的取余数算法H(k)=k% 5。则构造好的哈希表如图所示。 理想情况下,哈希函数在关键字和地址之间建立了一个一一对应关系,从而使得查找只需一次计算即可完成。由于关键字值的某种随机性,使得这种一一对应关系难以发现或构造。因而可能会出现不同的关键字对应一个存储地址。即 k1≠k2 , 但 H(k1)=H(k2 ), 这种现象称为 冲突 。 把这种具有不同关键字值而具有相同哈希地址的对象称 “ 同义词 ” 。 在大多数情况下,冲突是不能完全避免的。这是因为所有可能的关键字的集合可能比较大,而对应的地址数则可能比较少。 对于哈希技术,主要研究两个问题: (1)如何设计哈希函数以使冲突尽可能少地发生。 (2)发生冲突后如何解决 。 二、哈希函数 构造好的 哈希函数 的方法,应能使冲突尽可能地少,因而应具有较好的随机性。这样可使一组关键字的散列地址均匀地分布在整个地址空间

equal和hashcode

本小妞迷上赌 提交于 2020-01-12 04:00:58
引自 https://www.cnblogs.com/skywang12345/p/3324958.html =============================================== 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么 ? 2 equals() 与 == 的区别是什么 ? 3 hashCode() 的作用是什么 ? 4 hashCode() 和 equals() 之间有什么联系? ============================================== 1. 根据“ 类是否覆盖equals()方法 ”,将它分为2类。 (01) 若某个类没有覆盖equals()方法,当它的通过equals()比较两个对象时,实际上是比较两个对象是不是同一个对象。这时,等价于通过“==”去比较这两个对象。 (02) 我们可以覆盖类的equals()方法,来让equals()通过其它方式比较两个对象是否相等。通常的做法是:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。 2. == : 它的作用是 判断两个对象的地址是不是相等。 即,判断两个对象是不试同一个对象。 equals() : 它的作用也是 判断两个对象是否相等。 但它一般有两种使用情况(前面第1部分已详细介绍过): 情况1