首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏全栈程序员必看

    函数「建议收藏」

    是一种用于以常数平均时间执行插入、删除和查找的技术。 每个关键字被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。 这种映射就叫做函数 我认为,先用函数将我们所要进行操作的集合整合成列表,是对之后的操作的一种便利。放到实际中去,我们要进行操作的集合不仅仅只是数字,例如图书馆中的书籍分类等等。 我们可以通过某种规定,将每个关键字放到合适的为止上去,编写函数。但是难免会遇到两个关键词被单列到同一个值的情况,(称为冲突),如何解决冲突是一个很关键的问题,之后另开博。 int b[9]; int i; for(i = 0; i < 9; i++) { b[a[i]%10] = a[i]; //通过模10运算,将关键字合适的位置 设所有关键字最多8个字符长,由于char类型的值最多是127,因此这个函数之恩那个取值在0到27*8之间,若TableSize超过了1w,显然这并不是一种均匀的分配。

    1.4K30编辑于 2022-08-28
  • 来自专栏JMCui

    算法与

    因此,由Groudhog(3)生成的第一个实例的码与Groudhog(3)生成的码是不同的,所以无法查找到 key。但是仅仅重写hashCode()还是不够的,除非你重写equals()方法。 二、理解hashCode()      的价值在于速度:使得查询得以快速执行。 备注:为使分布均衡,Java的函数都使用2的整数次方来作为列表的理想容量。对现代的处理器来说,除法和求余是最慢的动作。使用2的整数次方的列表,可用掩码代替除法。 也就是说,它必须基于对象的内容生成码。 应该产生分布均匀的码。如果码都集中在一块,那么在某些区域的负载就会变得很重。 3、合并计算得到的值:result=37*result+c; 4、返回 result; 5、检查hashCode()最后生成的结果,确保相同的对象有相同的码。

    2.3K60发布于 2018-03-15
  • 来自专栏rikka

    复杂度分析: 顺序查找: O(n) 二分查找: O(\log_2n) 方法: O(C) 列表与方法 将一个元素的关键码和存储位置之间建立对应的函数关系 Hash( ), 使得每个关键码与结构中的唯一的存储位置相对应 : Address=Hash( ) 需要解决两个问题: 找到一个合适的函数,避免或尽量减少冲突 拟定解决冲突的方案 函数 取余法 列表中地址数位m, p为不大于m但最接近m的质数. 将结果化成八进制 处理冲突的闭(开地址)方法 产生冲突元素的关键码互为同义词. 如果hash1(key)计算得到的桶号d已经被占用, 那么用第二个函数hash2(key)计算得到 c, 则依次探查 d+c,d+2c,d+3c…. 再 当表项数>表的70%时, 可以再. 即, 建立一个两倍大的表, 新的函数取距离原规模两倍大小最近的素数. 处理冲突的开(链地址)方法 将同义词放入同一个桶.

    2.2K30编辑于 2022-02-07
  • 来自专栏xingoo, 一个梦想做发明家的程序员

    选择键值,冲突的时候采取不同的策略 函数: 简单的函数: 1 int hash(const string & key,int tableSize) 2 { 3 int hashVal = key.length();++i) 5 { 6 hashVal + = key[i]; 7 } 8 return hashVal % tableSize; 9 } 比较好的函数 与 列表大小的 比值 执行一次查找所需的时间:计算函数值所需要的常数时间加上遍历表所用的时间 不使用链表的列表: 当冲突发生时,直接寻找下一单元 <线性探测> <平方探测> 使用探测策略的列表的类接口 > 对分离散列表的再 1 void rehash() 2 { 3 vector<HashEntry> oldArray = array; 4 array.size(nextPrime if(oldArray[i].info == ACTIVE) 13 insert(oldArray[i].element); 14 } 15 } 对探测列表的再

    1.1K90发布于 2018-01-17
  • 来自专栏全栈程序员必看

    查找和哈希查找_检索

    采用技术将记录存在在一块连续的存储空间中,这块连续存储空间称为列表或哈希表。那么,关键字对应的记录存储位置称为地址。   技术既是一种存储方法也是一种查找方法。 2.3 平方取中法 这个方法计算很简单,假设关键字是1234,那么它的平方就是1522756,再抽取中间的3位就是227,用做地址。 比如关键字是9876543210,列表表长为三位,将它分为四组,987|654|321|0,然后将它们叠加求和987 + 654 + 321 + 0 = 1962,再求后3位得到地址962。 总之,现实中,应该视不同的情况采用不同的函数,这里只能给出一些考虑的因素来提供参考: (1)计算地址所需的时间 (2)关键字的长度; (3列表的长度; (4)关键字的分布情况 (3列表的装填因子 所谓的装填因子a = 填入表中的记录个数/列表长度。a标志着列表的装满的程度。当填入的记录越多,a就越大,产生冲突的可能性就越大。

    1.6K20编辑于 2022-11-15
  • 来自专栏文武兼修ing——机器学习与IC设计

    分离链接的代码实现

    列为一种用于以常数平均时间执行插入,删除和查找的技术。一般的实现方法是使通过数据的关键字可以计算出该数据所在中的位置,类似于Python中的字典。 关于需要解决以下问题: 的关键字如何映射为一个数(索引)——函数 当两个关键字的函数结果相同时,如何解决——冲突 函数 函数为关键字->索引的函数,常用的关键字为字符串,则需要一个字符串 ->整数的映射关系,常见的三种函数为: ASCII码累加(简单) 计算前三个字符的加权和$\sum key[i] * 27^{i}$ (不太好,3个字母的常用组合远远小于可能组合) 计算所有字符加权和并对长度取余 ) int { hash := 0 time := utf8.RuneCountInString(n.key) if time > 3 { time = 3 ,发生冲突,本次使用分离链接法解决: 每个中的数据结构有一个指针可以指向下一个数据,因此列表可以看成链表头的集合 当插入时,将数据插入在对应值的链表中 访问时,遍历对应值的链表,直到找到关键字

    2.2K80发布于 2018-04-27
  • 来自专栏全栈程序员必看

    Hash

    为了速度而 HashMap速度总所周知是非常快的,但是为什么会这么快,是因为它的技术,下面简单理解一下知识 的价值在于速度,使得查询得以快速。 一般容器查询的速度的瓶颈位于键的查询,采取的做法一般是对键进行排序,但则不是 的特点 的做法,通常把键保存到某个地方,存储一组元素最快的数据结构就是数组,所以用它来保存键的信息(不是键本身 的做法,数组不保存键本身,而是通过键对象生成一个随机数字,用作数组的下标,这个数字就是我们通常见到的hashCode。 我们查询是通过查询对象计算出一个码,如果能保证没有冲突,重复,那就可能有了一个完美的函数。 slot 和 bucket 中的槽位(solt)通常称为桶位,以内实际列表的数组名称为bucket, 桶的数量都使用质数。

    1K10编辑于 2022-08-27
  • 来自专栏全栈程序员必看

    冲突

    概念:如果当一个元素被插入时与一个已经插入的元素列到相同的值, 那么就会产生冲突, 这个冲突需要消除。 为执行一次查找,我们使用函数来确定是那一个链表, 然后我们在被确定的链表中执行一次查找。 = 0 && n % 3 != 0 && n % 5 != 0 && n % 7 ! = 0) return true; else return false; } /* * 对分离链接列表和探测列表的在 = 0 && n % 3 != 0 && n % 5 != 0 && n % 7 !

    98710编辑于 2022-08-27
  • 来自专栏全栈程序员必看

    查找

    49=7041 若m为127,则返回的地址为56. 3、数字分析法 数字分析法是取关键字中某些取值较分散的数字位作为地址的方法。 (3)双函数探查法 这种方法使用两个函数h1和h2,其中,h1和前面的h(k)一样,以关键字为自变量,产生一个0至m-1之间的数作为地址;h2也以关键字为自变量,产生一个1至m 例10-3 假定一个集合B为B={ 18,75,60,43,54,90,46,31,58,73,15,34} 为进行存储,假定采用的函数为: h(k)=k%13 当发生冲突时,假定采用链接法处理 3存储的性能分析 在存储中,插入和查找的速度是相当快的,它优于前面介绍过的任一种存储方法,特别是当数据量很大时更是如此。 (3)在列表中只能按关键字查找元素,而无法按非关键字查找元素。

    1.9K10编辑于 2022-08-27
  • 来自专栏linux驱动个人学习

    函数

    概念 的概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。 hash函数就是把任意长的输入字符串变化成固定长的输出字符串的一种函数。 (Hashing)通过函数将要检索的项与索引(值)关联起来,生成一种便于搜索的数据结构(列表)。 应用 目前应用最为广泛的hash函数是SHA-1和MD5,大多是128位和更长。 (1)函数的计算简单,快速; (2)函数能将关键字集合K均匀地分布在地址集{0,1,…,m-1}上,使冲突最小。 (3)平方取中法: 取关键字平方后的中间几位为哈希地址。 通过平方扩大差别,另外中间几位与乘数的每一位相关,由此产生的地址较为均匀。这是一种较常用的构造哈希函数的方法。 (0100,0110,1010,1001,0111) 平方后得(0010000,0012100,1020100,1002001,0012321) 若取表长为1000,则可取中间的三位数作为地址集

    1.3K30发布于 2019-09-24
  • 来自专栏动态规划

    C++ —— 哈希详解 - 开与闭

    哈希的概念 哈希(hash)⼜称,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。 当使⽤除法法时,建议M取不太接近2的整数次冥的⼀个质数(素数) 1.4.2 乘法法 1. 这种情况是可以存在的,只要函数是公开且确定的,就可以实现此攻击。解决⽅法⾃然是⻅招拆招,给函数增加随机性,攻击者就⽆法找出确定可以导致最坏情况的数据。这种⽅法叫做全域 2. 需要注意的是每次初始化哈希表时,随机选取全域函数组中的⼀个函数使⽤,后续增删查改都固定使⽤这个函数,否则每次哈希都是随机选⼀个函数,那么插⼊是⼀个函数,查找⼜是另⼀个函数,就会导致找不到插 双重 1.

    61300编辑于 2024-11-19
  • 来自专栏wym

    Hash()冲突解决 线性探测再和二次探测再

    线性探测再 例如  哈希函数为: H(key) =  key %13,key 为关键字,采用开放地址法中的线性探测再解决冲突,依次输入 11 个关键字,16,74,60,43,54,90,46, 31,29,88,77,构造哈希表 image.png  如图,例如 16%13=3,将16放入3号位置,29%13 = 3,将29放入3号位置,而此时3号位已经有元素。 二次探测再 例如  哈希函数为: H(key) =  key %13,key 为关键字,采用开放地址法中的二次探测再解决冲突,依次输入 10 个关键字,36,21,45,17,29,55,35, 61,40,78,构造哈希表 image.png 对于29%13=3,将29放入3号位置, 55%13=3,此时3号位置已经有元素, 则查找 3 + 1^2 = 4,有元素 查找 3 - 1^2 = 2 ,没有则放入,如果还有元素则查找3 + 2^2, 3-2^2.... 3+k^2, 3 - k^2。

    17.4K20发布于 2018-12-28
  • 来自专栏明丰随笔

    浅谈运算

    运算具有4个特点: 1. 运算是不可逆的,可以将运算理解为单向的加密:根据原消息经过运算可以得到摘要(密文);但是根据摘要,无法推导出原消息。 2. 3. 不论原始消息的大小如何,运算得出的摘要信息是固定长度的。摘要的长度根据算法的不同而不同,如64位或128位等。 4. 2.接收方获得消息和原始摘要,使用相同的算法对收到的消息进行运算,重新获得一个摘要(本地摘要)。 3.对比原始摘要和本地摘要,如果两个相同,则认为消息没有被篡改;否则认为消息被篡改过了。 3. 假设第三方截获了消息"Hello world!"和摘要,并将消息改为了"Hi world!",但它并不知道密钥"[MyKey]",因此,它仍对消息"Hi world!" 运算具有4个特点 算法保证了消息的完整性 算法与密钥算法 .Net中对运算支持

    1.6K20发布于 2019-07-24
  • 来自专栏CoffeeLand

    hash introduction

    Table of Content hash概念 hash冲突 构造hash hash的应用 hash概念 hash是在记录的存储位置与他的关键字之间建立的对应关系f, 使得每个key都对应一个存储位置 这个hash函数也被称为hash table address = f(key) hash是一种查找的存储技术. hash冲突 每一个key对应一个address, 当key1 ! = key2, f(key1) == f(key2),这种情况被称为hash冲突(collision) 构造hash hash的应用 cryptography, compression, checksum

    71520发布于 2020-03-26
  • 来自专栏全栈程序员必看

    查找-查找

    那么关键字对应的记录存储位置,我们称为地址。 2.列表查找步骤 (1)在存储时,通过函数计算记录的地址,并按此地址存储该记录。 3.函数的构造方法 (1)直接定址法 我们可以取关键字的某个线性函数值为地址,即 ∗∗f(key)=a∗key+b(a、b为常数) **f(key)=a*key+b(a、b为常数)** 这样的函数有点就是简单 (3)平方取中法 这个方法计算很简单,假设关键字是1234,那么它的平方就是1522756,再抽取中间的3位就是227,用做地址。 再比如关键字是4321,那么它的平方就是18671041,抽取中间的3位就可以是671,也可以是710,用做地址。平方取中法比价适合于不知道关键字的分布,而位数又不是很大的情况。 比如我们的关键字是9876543210,列表表长为三位,我们将它分为四组,987|654|321|0,然后将它们叠加求和987+654+321+0=1962,再求后3位得到地址为962。

    2.1K40编辑于 2022-08-28
  • 来自专栏程序那些事

    单向函数

    这个时候就需要单向函数了。一般来说网站会提供MD5或者SHA的值作为验证值。 单向函数有一个输入和输出。输入称为消息,输出称为值。 值的长度跟消息的长度无关,不论多少大小的长度的消息,都会计算出固定长度的值。 单向函数的性质 单向函数具有下面几个特性: 能够根据任意长度的消息计算出固定长度的值。 消息不同,值也不同。 这就意味着,如果仅仅是一点点的变动都会引起整个值的巨大变化。 因为值的大小是固定的,所以有可能会出现不同的消息产生相同值的情况。这种情况叫做碰撞。 当给定某条消息的值时,必须保证很难找到和该消息具有相同值的另一条消息。 单向函数必须具有单向性。所谓单向性是指无法通过值来反推出消息的性质。 SHA-3是在2005年SHA-1被攻破的背景下开始制定的,SHA-3是通过公开竞争的方法选拔出来的,最终被选中的算法叫做Keccak算法。

    1.2K20发布于 2020-07-08
  • 来自专栏南桥谈编程

    哈希:哈希函数 | 哈希概念 | 哈希冲突 | 闭 | 开

    哈希也叫做,是一种映射,把值和值进行一对一或者一对多关联。 哈希表:使用哈希思想实现的数据结构。一般都是将值和存储位置建立映射关系。 解决哈希冲 闭:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。 删除: 采用闭处理哈希冲突时,不能随便物理删除哈希表中已有的元素,若直接删除元素会影响其他元素的搜索。 其中:i =1,2,3…, H_0 是通过函数Hash(x)对元素的关键码 key 进行计算得到的位置,m是表的大小。 开法又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中

    59910编辑于 2024-09-07
  • 来自专栏全栈程序员必看

    线性探测再

    在此称该函数H为哈函数或函数。按这种方法建立的表称为哈希表或列表。 =1,2,3,…, m-1,称线性探测再; 2.di=1^2, -1^2, 2^2,-2^2, 3^2, …, ±(k)^2,(k<=m/2)称二次探测再3.di=伪随机数序列,称伪随机探测再法:Hi=RHi(key), i=1,2,…,k. RHi均是不同的函数,即在同义词产生地址冲突时计算另一个函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间; 链地址法(拉链法):将所有关键字为同义词的记录存储在同一线性链表中 用二次探测再法解决冲突: 1:(key+1^2)%11=(49+1)%11=6,仍然发生冲突. 2:(key-1^2)%11=(49-1)%11=4,仍然发生冲突. 3:(key+2^2)%11

    86830编辑于 2022-08-28
  • 来自专栏加密解密

    哈希函数算法

    一、哈希函数/算法文档 1.1、哈希函数介绍 哈希函数(Hash function),又称函数、算法,它是一种不可逆的信息摘要算法,具体实现就是把任意长度的输入信息通过哈希算法变成固定长度的输出信息 1.3、哈希函数的特点 哈希函数没有特定的公式,一般只要符合算法的要求即可,只要符合算法的要求都可以称之为哈希算法,以下为哈希函数的主要特点: 无论输入的消息有多长,计算出来的哈希值总是固定的; 通常情况下,不同的需求使用不同安全系数的算法,常见的安全哈希算法分类为:MD算法、SHA算法、MAC算法。 、SHA-384、SHA-512、SHA-512/224、SHA-512/256等; SHA-3算法:SHA算法分支的最新版本,也是官方推荐使用的安全版本。 因为MAC算法融合了密钥函数(keyed-Hash),通常我们也把MAC算法称为HMAC(Keyed-Hash Message Authentication Code)。

    1.4K40编辑于 2023-03-17
  • 来自专栏移动开发面面观

    函数(哈希)(转)

    概述 Hash一般翻译作也有直接音译作“哈希”。就是把任意长度的输入通过算法变换成固定长度的输出,该输出就是值。 值的空间通常远小于输入的空间,不同的输入可能会列成相同的输出,所以不可能从值来确定唯一的输入值。 哈希函数的应用非常广泛,各种校验、签名、密码,都是哈希函数应用的重要场景。 性质 确定性:哈希的值不同,那么哈希的原始输入也就不同。 不确定性:同一个值很有可能对应多个不同的原始输入。称为“哈希碰撞”。 实现 哈希函数的实现分为两部分:构造和解决冲突。 构造 哈希函数的构造应该满足以下准则: 函数的计算简单,快速。 函数能将关键字集合K均匀地分布在地址集{0,1,…,m-1}上,使冲突最小。 再哈希法:(双法) 在发生哈希冲突后,使用另外一个哈希算法产生一个新的地址,直到不发生冲突为止。这个应该很好理解。

    1.3K10发布于 2018-12-28
领券